1. JavaScript 定义了几种数据类型? 哪些是原始类型?哪些是复杂类型?原始类型和复杂类型的区别是什么?
- 7种数据类型,Number, String, Boolean, Undefined, Null, Object, Symbol
- 原始类型,Number, String, Boolean, Undefined, Null, Symbol
- 复杂类型,Object
- 原始类型和复杂类型的区别是什么
- 基本(原始)类型变量存的是值(栈内存),复杂类型的变量存的是内存地址(堆内存)
- 基本(原始)类型在赋值的时候拷贝值,复杂类型在赋值的时候只拷贝地址,不拷贝值
- 详细解释:方方: JS里基本类型(值)和复杂类型(引用)有什么区别?
2. typeof和instanceof的作用和区别?
- typeof,作用于用于判断一个一个表达式、对象或原始值的数据类型,返回的是一个字符串,返回的值有(参照mdn):
类型 | 结果 |
---|---|
Undefined | "undefined " |
Null | "object " |
Boolean | "boolean " |
Number | "number " |
String | "string " |
Symbol (ES 6新增) | "symbol " |
宿主对象 (由JS环境提供) | Implementation-dependent |
函数对象 | "function " |
其他对象 | "object " |
- instanceof,用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性,语法为
object instanceof constructor
,object 为要检测的对象,constructor 为某个构造函数,返回值为 true 或 false,如:
var a = {};
var b = [];
a instanceof Object; //true
b instanceof Array; //true
[] instanceof Array; //true
3. 如何判断一个变量是否是数字、字符串、布尔、函数
- 用 typeof 直接进行判断
typeof a; //"object"
typeof 2; //"number"
typeof 'a'; //"string"
typeof true; //"boolean"
function fn(){}
typeof fn; //"function"
4. NaN是什么? 有什么特别之处?
- NaN (Not a Number),
typeof NaN //number
它本身是数值类型,但是它表示的是一个非数值,用于表示一个本来要返回数值的操作数未返回数值的情况 - 特别之处:
- 任何涉及到 NaN 的操作(例如 NaN/100)都会返回NaN
- NaN 与任何值都不相等,包括 NaN 本身,所以判断一个值是否是 NaN,只能用函数
Number.isNaN()
或isNaN()
NaN == NaN; // false
NaN === NaN; // false
Number.isNaN(NaN); //true
isNaN(NaN); // true
5. 如何把非数值转化为数值?
- Number() ,可以用于任何数据类型,转换规则如下
- Boolean值,true 和 false 分别被转换为1 和 0
- 数值,不变
- Null,0
- Undefined,NaN
- 字符串,遵循如下规则
- 字符串中只包含数字(包括前面的 + - 号),则将其转换为十进制数值(会忽略前导的 0)
- 如果包含有效的浮点格式,则将其转换为浮点数(会忽略前导的 0)
- 如果包含有效的十六进制格式,则将其转换为相同大小的十进制数值
- 空字符串,0
- 如果字符串中包含除上述格式之外的字符,则将其转换为NaN
- 对象,则调用对象的 valueOf() 方法,然后依照前面的规则转换返回的值。如果转换的结果是 NaN,则调用对象的 toString() 方法,然后再次依照前面的规则转换返回的字符串值
Number(true); //1
Number(''); //0
Number('00123'); //123
Number('hello'); //NaN
- parseInt(),专门用于把字符串转换成数值,常用于处理整数
- 忽略字符串前面的空格,如果第一个非空格字符不是负号或者数字字符,则返回 NaN
- 如果是继续解析,直到解析完或者遇到了非数字字符
- 可以指定第二个参数即转换时使用的基数
- 不能识别小数点
- 空字符串返回 NaN
parseInt('1234blue'); //1234
parseInt(''); //NaN
parseInt('A7C',16); //2684
- parseFloat(),专门用于把字符串转换成数值,常用于处理浮点数,与 parseInt() 相比区别如下
- 可以识别字符串中第一个小数点
- 只解析十进制值
- 如果字符串可解析为整数,则返回整数
parseFloat('1234blue'); //1234
parseFloat('22.4.5'); //22.4
parseFloat('0xAB'); //0
parseFloat('1.68e8'); //168000000
参考书籍《JS高程》
6. == 与 === 有什么区别?
- ==,先转换在比较
转换规则如下- 如果有一个数是布尔值,则在比较相等性之前先将其转换为数值,true 为 1,false 为 0
- 如果一个操作数是字符串,另一个操作数是数值,则在比较之前先将字符串转换
- 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf()方法,用得到的基本类型值照前面的规则进行比较
比较规则 - undefined 和 null 是相等的
- 如果有一个操作数是 NaN,则相等操作符返回 false
- 如果两个操作数都是对象,则比较是不是同一个对象,如果两个操作数都指向同一个对象,相等操作符返回 true
'1' == 1; //true
true == 1; //true
undefined == null; //true
NaN == 'NaN'; //false
- ===,仅比较不转换,仅在两个操作数未经转换就想等的情况下返回 true
7. break与continue有什么区别?
- break,会立即退出循环,强制执行循环后面的语句。如下例:
var num = 0;
for (var i = 1; i < 10; i++) {
if(i % 5 == 0) {
break;
}
num++;
}
alert(num); //4
- continue,也是立即退出循环,但退出循环后会从循环的顶部继续执行
var num = 0;
for (var i = 1; i < 10; i++) {
if(i % 5 == 0) {
continue;
}
num++;
}
alert(num); //8
参考书籍《JS高程》
8. void 0 和 undefined 在使用场景上有什么区别?
- undefined,undefined 并不是保留词(reserved word),它只是全局对象的一个属性。在低版本 IE 中能被重写。
var undefined = 10;
alert(undefined);
// undefined -- chrome
// 10 -- IE 8
undefined 在 ES5 中已经是全局对象的一个只读(read-only)属性了,它不能被重写。但是在局部作用域中,还是可以被重写的,所以undefined现常用于全局环境。
(function() {
var undefined = 10; //局部变量
alert(undefined);
})();
// 10 -- chrome
(function() {
undefined = 10; //全局变量
alert(undefined);
})();
// undefined -- chrome
- void 0,void 运算符能对给定的表达式进行求值,然后返回 undefined。也就是说,void 后面你随便跟上一个表达式,返回的都是 undefined,都能完美代替 undefined!更重要的前提是,void 是不能被重写的(cannot be overidden)。事实上,不少 JavaScript 压缩工具在压缩过程中,正是将 undefined 用 void 0 代替掉了。
参考文章:为什么用「void 0」代替「undefined」
9. 以下代码的输出结果是?为什么?
console.log(1+1); //2,两数值相加,直接计算
console.log("2"+"4"); //"24",两字符串相加,直接拼接
console.log(2+"4"); //"24",只有一个操作数是字符串,将另一个转换为字符串,进行拼接
console.log(+"4"); //4,对非数值应用一元加操作符时,该操作符会像Number()转型函数一样对这个值执行转换
10. 以下代码的输出结果是?
var a = 1;
a+++a; //3,++优先级高,可写为(a++) + (a),1+2=3
typeof a+2; //"number2", typeof 的优先级比较高,先输出 typeof a
的结果字符串"number",再与数值2进行加法操作,得到结果字符串"number2"
11. 以下代码的输出结果是? 为什么
var a = 1;
var b = 3;
console.log( a+++b );
//4,++优先级高,先执行 a++,在+ b,即 1+3
原因:a++ 返回原来的值,++a返回加1后的值。
12. 遍历数组,把数组里的打印数组每一项的平方
var arr = [3,4,5]
for (var i = 0; i < arr.length; i++) {
console.log(arr[i] * arr[i]);
}
13. 遍历 JSON, 打印里面的值
var obj = {
name: 'hunger',
sex: 'male',
age: 28
}
for (i in obj) {
console.log(obj[i]);
}
14. 以下代码输出结果是? 为什么
var a = 1, b = 2, c = 3;
var val = typeof a + b || c >0
console.log(val)
//number2,优先级顺序为typeof,+,>,||;||逻辑或运算符在第一个操作数是对象时,返回第一个操作数
var d = 5;
var data = d ==5 && console.log('bb')
console.log(data)
//undefined, == 的优先级高于 &&, &&逻辑与操作符在第一个操作数是对象时,返回第二个操作数,data = 'bb',
**但此处有坑,console.log('haha'); 控制台输出的是haha,但是将console.log('haha');这个语句赋值给一个变量,那么这个变量,就是undefined。(偷看了前面学姐的答案!)**
var data2 = d = 0 || console.log('haha')
console.log(data2)
//undefined,||逻辑或运算符在第一个操作数的求值结果是 false 时,返回第二个操作数,data2 = 'haha'
var x = !!"Hello" + (!"world", !!"from here!!");
console.log(x)
//2,!!为取两次非,优先级顺序为 ! !!,+,,;var x = true + true;
网友评论