代码在node.js环境中测试通过。
比较运算符
false == 0; // true
false === 0; // false
NaN === NaN; // false
isNaN(NaN); // true
1 / 3 === (1 - 2 / 3); // false
Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001; // true
第一种是==比较,它会自动转换数据类型再比较
第二种是===比较,它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较。
NaN这个特殊的Number与所有其他值都不相等,包括它自己
唯一能判断NaN的方法是通过isNaN()函数
浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。要比较两个浮点数是否相等,只能计算它们之差的绝对值,看是否小于某个阈值
数组和对象
[].length; //0
({}).constructor; //[Function: Object]
'abc'.length;//3
(1).constructor;//[Function: Number]
false.constructor;//[Function: Boolean]
在js中,数组和对象是语言原生支持的数据结构。啥叫“原生支持”,就是当创建了这种数据结构时,就自带一堆属性和方法。类似的,字符串、boolean和Number也是原生的数据结构。
布尔表达式
if(!null){console.log(1)};//1
if(!undefined){console.log(1)};//1
if(!0){console.log(1)};//1
if(!NaN){console.log(1)};//1
if(!''){console.log(1)};//1
if({})(console.log(1))//1
JavaScript把null、undefined、0、NaN和空字符串''视为false,其他值一概视为true。
不要试图认为{}是null。因为{}是js内置对象,出生自带光环(({}).constructor;)的,所以必然不是null。
var c = {};
if(JSON.stringify(c) ==="{}"){ console.log(1);}//1
迭代
for ... in循环由于历史遗留问题,它遍历的实际上是对象的属性名称。
当我们手动给Array对象添加了额外的属性后,for ... in循环将带来意想不到的意外效果:
var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x in a) {
console.log(x); // '0', '1', '2', 'name'
}
for ... of循环则完全修复了这些问题,它只循环集合本身的元素.但是for of循环只能作用于集合对象。
//一个对象
var xiaoming = {
name: '小明',
birth: 1990,
school: 'No.1 Middle School',
height: 1.70,
weight: 65,
score: null
};
//测试遍历对象for of
for (var x of xiaoming) { //TypeError: xiaoming is not iterable
console.log(x);
}
//测试遍历对象for in
for (var x in xiaoming) { //ok
console.log(x);
}