遇到+/==/===比较时的字符转换

第一题:
100 + true + 21.2 + null + undefined + "Tencent" + [] + null + 9 + false;
//'NaNTencentnull9false'

在两边出现字符串(或者对象)的情况下,加号一定是字符串拼接=>对象本身是要转换为数字进行运算的,只不过转换数字的过程中,需要先转换为字符串才能转换为数字,而一旦转换为字符串就变成字符串拼接了。
对象转换为字符串先调用valueOf获取原始值(一般都是基本类型值),如果不是基本类型值则继续调用toString()

第二题:
[]==false; //=>true
![]==false; //=>true
[]==![]; //=>true
  • == 在进行比较都时候,如果左右两边数据类型不一致则需要先默认转换为一致的数据类型,然后再进行比较;* === *绝对相等,两边类型一致值也一致才相等,类型不一样直接不相等,不会转换。

==比较时的规则:

  1. 对象 == 字符串 对象转换为字符串 [10] == ‘10’–>true
  2. null == undefined (三个等号不相等),但是和其它任何值都不相等,eg: 0==null–>false
  3. NaN和任何值(包括自己)都不相等,判断是否为NaN用isNaN()方法
  4. 剩下都情况都是转换为数字再比较
//所以此题解析:
[]==false; //都转换为数字 Number([].toString())->Number('')->0;Number(false)->0; true

  • 运算符优先级,先![]再进行相等*==*比较。
    ![]转换为布尔值进行取反(把其它类型值转换为布尔类型值遵循的规律:只要0/NaN/null/undefined/’'这五个值是false,其它都是true)

转换规则:浏览器底层运行的时候都要按照自己的转换规则:

  1. 把其它值转换为数字;
  2. 把其它值转换为布尔值;
  3. ==比较的时候。
    这三个互不干扰。
//所以此题解析:
![]==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"

大括号{}在运算符前面:

  1. 在没有使用小括号处理优先级的情况下,不认为是数学运算,加小括号才算
  2. 出现在运算符的后面,认为是数学运算
第四题:
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中对象的属性名是什么格式的?

  1. 普通对象的属性名只能是“字符串”(普通对象的属性名可以是基本数据类型)
  2. Map()这种数据结果直接对象作为属性名;
  3. 但是普通对象的属性名不能是对象,如果是对象,需要转换为字符串存储
  4. 当对象的属性名是非字符串的基本数据类型时,加引号和不加都可以(数字、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 '.'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值