第一题:
100 + true + 21.2 + null + undefined + "Tencent" + [] + null + 9 + false;
//'NaNTencentnull9false'
在两边出现字符串(或者对象)的情况下,加号一定是字符串拼接=>对象本身是要转换为数字进行运算的,只不过转换数字的过程中,需要先转换为字符串才能转换为数字,而一旦转换为字符串就变成字符串拼接了。
对象转换为字符串先调用valueOf获取原始值(一般都是基本类型值),如果不是基本类型值则继续调用toString()
第二题:
[]==false; //=>true
![]==false; //=>true
[]==![]; //=>true
- == 在进行比较都时候,如果左右两边数据类型不一致则需要先默认转换为一致的数据类型,然后再进行比较;* === *绝对相等,两边类型一致值也一致才相等,类型不一样直接不相等,不会转换。
==比较时的规则:
- 对象 == 字符串 对象转换为字符串 [10] == ‘10’–>true
- null == undefined (三个等号不相等),但是和其它任何值都不相等,eg: 0==null–>false
- NaN和任何值(包括自己)都不相等,判断是否为NaN用isNaN()方法
- 剩下都情况都是转换为数字再比较
//所以此题解析:
[]==false; //都转换为数字 Number([].toString())->Number('')->0;Number(false)->0; true
- 运算符优先级,先![]再进行相等*==*比较。
![]转换为布尔值进行取反(把其它类型值转换为布尔类型值遵循的规律:只要0/NaN/null/undefined/’'这五个值是false,其它都是true)
转换规则:浏览器底层运行的时候都要按照自己的转换规则:
- 把其它值转换为数字;
- 把其它值转换为布尔值;
- ==比较的时候。
这三个互不干扰。
//所以此题解析:
![]==false; //=> ![]==false --> false==false --> true
第三题:
{}+0?alert('ok'):alert('no');
0+{}?alert('ok'):alert('no');//*
{}大括号在JS中非常特殊:对象、代码块(块作用域),此处把大括号当作一个代码块,后面是+0;+值,这个操作是数学运算(不论加谁)
{}//当作一个代码块
+0
{}+0 --> +0 -->0-->false
//大括号出现在+号都前面表示一个单独的代码块,跟+号没关系
{}+0;//0
{xxx:'aaa'}+0;//0
({})+0;//=>"[object Object]0"
({}+0);//=>"[object Object]0"
({xx:'aa'})+0;//=>"[object Object]0"
function aa(){}+0;//=>0
(function aa(){}+0);//=>"function aa(){}0"
大括号{}在运算符前面:
- 在没有使用小括号处理优先级的情况下,不认为是数学运算,加小括号才算
- 出现在运算符的后面,认为是数学运算
第四题:
var a={}, b='0', c=0;//a[0]==a['0']
a[b]='你好';
a[c]='世界';
console.log(a[b]);
//----------------------
var a={}, b=Symbol('1'), c=Symbol('1');
a[b]='你好';
a[c]='世界';
console.log(a[b]);
//----------------------
var a={}, b={n:'1'}, c={m:'2'};
a[b]='你好';
a[c]='世界';
console.log(a[b]);//*
在JS中对象的属性名是什么格式的?
- 普通对象的属性名只能是“字符串”(普通对象的属性名可以是基本数据类型)
- Map()这种数据结果直接对象作为属性名;
- 但是普通对象的属性名不能是对象,如果是对象,需要转换为字符串存储
- 当对象的属性名是非字符串的基本数据类型时,加引号和不加都可以(数字、true、null、undefined)
obj[‘null’]–obj[null]
obj[‘12’]–obj[12]
obj[true]–obj[‘true’]
var a={}, b='0', c=0;//a[0]==a['0']
a[b]='你好';
a[c]='世界';
console.log(a[b]);
//Symbol('1')==Symbol('1');//=>false
var a={}, b=Symbol('1'), c=Symbol('1');
a[b]='你好';
a[c]='世界';
console.log(a[b]);
var a={}, b={n:'1'}, c={m:'2'};
a[b]='你好';
a[c]='世界';
console.log(a[b]);//*
//普通对象调用同 String方法时是调取Object.prototype.toString,是用来检测数据类型的
Object.prototype.toString.call({a:1});//=>"[object Object]"
a;//=>{[object Object]: "世界"}
({n:1}).toString();//=>"[object Object]"
//对象使用toString()方法时必须加小括号,否则报错
{}.toString();//=>VM419:1 Uncaught SyntaxError: Unexpected token '.'