第一家H姓公司

先做了一套面试题,题目看似比较基础但又不失刁钻,比叫考验基本功,做了题才发现自己是问啥啥不会,就连基本的number和string的运算原则都忘记了,内心真的感觉很丢人。
上题目:

1. 输出表达式:-1+-1+"2"+"2" +1-+"2"+"2" 的结果

这道题考的是基本数据类型number和string的运算原则,数字字符串与number数字做加操作结果都是字符串类型,与自己或number数字做减操作结果都是number类型。

2. JavaScript中的类型转换是怎样的?

要知道JavaScript中的数据类型之间是怎么转换的,就先来复习一下JavaScript中的数据类型。

JavaScript中的数据类型

在JavaScript中有五种数据类型:

  • string
  • number
  • boolean
  • object
  • function

还有三种对象类型:

  • Object
  • Date
  • Array

两个不包含任何值的数据类:

  • null
  • undefined

typeof 操作符

使用typeof操作符可以来查看变量的数据类型。

1
2
3
4
5
6
7
8
typeof null        // object
typeof 22 // number
typeof 'gg' // string
typeof [0, 0, 0] // object
typeof new Date() // object
typeof true // boolean
typeof NaN // number
typeof myLuck // undefined

注意:

  • NaN 的数据类型是number
  • 数组(Array)的数据类型是object
  • 日期的数据类型是object
  • null 的数据类型是object
  • 未定义的变量的数据类型是undefined

所以仅仅用typeof来进行变量类型的判断是远远不够的。

constructor 属性

constructor属性返回所有JavaScript变量的构造函数。

1
2
3
4
5
6
7
'gg'.constructor                 // ƒ String() { [native code] }
(666).constructor // ƒ Number() { [native code] }
[6, 6, 6].constructor // ƒ Array() { [native code] }
true.constructor // ƒ Boolean() { [native code] }
new Object().constructor // ƒ Object() { [native code] }
new Date().constructor // ƒ Date() { [native code] }
(function aaa() {}).constructor // ƒ Function() { [native code] }

是不是发现了新大陆,所有类型感觉都可以一网打尽了,绝不错杀一个,嘿嘿嘿!

1
2
3
4
5
6
7
8
9
let arr = [0, 1, 2, 3, 4, 5];
if (arr.constructor.toString().indexOf('Array') > -1) {
// 是数组错不了了
}

let date = new Date();
if (date.constructor.toString().indexOf('Array') > -1) {
// 是Date没跑了
}

JavaScript 类型转换

JavaScript变量可以转换为新变量或者其它数据类型:

  • 通过使用JavaScript函数
  • 通过JavaScript自身自动转换

数字转换为字符串

全局方法String可以将数字、布尔值、日期、转换为字符串。

1
2
3
4
String(123);         // 将数字123转换为123的字符
String(123 + 100); // 将表达式的结果转换为字符串
String(true); // 将true转换为字符串的'true'
String(new Date()); // 返回"Thu Nov 01 2018 23:11:05 GMT+0800 (中国标准时间)"

将字符串转换为数字

全局方法Number() 可以将字符串转换为数字

1
2
3
Number('666');     // 返回 666
Number('z'); // 返回 NaN
Number('66.66'); // 返回 66.66

方法 描述
paseFloat() 解析一个字符串,并返回一个浮点数
paseInit 解析一个字符串,返回一个整数

自动转换类型

1
2
3
3 + '1'  // 返回 '31'    3由number自动转换为'3'string
'5' - 1 // 返回 4 '5'由string自动转换为5number
'5' * 3 // 返回 15 '5'由string自动转换为5number

一元运算符 + 在与字符串运算时会把number转换为string
-、*、/ 字符串与数字运算时会将string转换为number再进行运算

3. Javascript作用域是怎样的?

在JavaScript中每个函数内部的一系列变量和访问变量的规则统称为作用域。多作用域可以嵌套,外部作用域访问不了内部作用域的变量,只能从内部访问外部作用域的变量。而且同一个作用域中变量名必须唯一。

4. 解释JavaScript中的相等判断

判断两个变量是否相等时,有两种比较符号:

  • 全等于 (===): 判断变量的值和他的类型
  • 等于 (==): 只判断变量的值
1
2
3
4
0 == false   // true
0 === false // false 虽然都表示否,但类型不同
1 == '1' // true
1 === '1' // false 虽然都是1, 但一个是number,一个是string

5. 回调函数是什么?

简单来说,就是把一个函数当做参数传入正在调用的函数中,并在当前函数体内执行传入的参数函数。这个过程在JavaScript中也叫作闭包,因为传入的回调函数内部可以访问到当前函数内部的作用域,而且在回调函数未执行之前一直会占用内存,直到回调函数执行后才会销毁这部分内存。

1
2
3
4
5
6
7
8
9
10
11
12
13
function myCallback(data) {
let value = 666;
console.log(value + data);
}

function MyFun(callback) {
console.log('666');
callback(233);
}

MyFun(myCallback);
// 666
// 899

6. “use strict” 的作用

“use strict” 是放在js文件第一行来进行声明当前js的执行环境使用严格模式,在严格模式下,必须按照严格模式个要求编写js代码,否则运行时就会抛出错误。

1
2
3
// 比如在严格模式下必须使用变量声明符来声明变量
a = 111; // 错误,在严格模式下会报错
var a = 111; // 正确

7. null 和undefined 的区别

null表示一个空的对象指针,undefined则表示变量未定义初始值

参考