필기 시험 문제를 작성할 때
"1" + 2 obj + 1 [] == ![] [null] == false
===
叫做严格运算符,对象类型指向地址相同或原始类型( 数值、字符串、布尔值)值相同;==
叫做相等运算符,类型不同会进行转化再比较,undefined、null相等,对象类型还是比较引用。==
运算符将原始值和其包装对象视为相等,但===
연산자와 같이 암시적 변환이 포함된 문제를 자주 접하게 됩니다.
모두 obj.a==null(obj.a=== null || obj.a ===정의되지 않음
과 동일). obj.a=== null || obj.a ===undefined
)。
相等运算符就是常常引起JS隐式转换的坑货,它也常常出现在我们的面试题中,不过我们在现实开发中,为了避免不必要的问题要求使用严格运算符,但是了解还是很有必要的。
想要了解JS隐式转换,就要先从三个知识点下手。
原始类型(基本类型、基本数据类型、原始数据类型)是一种既非对象也无方法的数据。在 JavaScript 中,共有7种:string,number,bigint,boolean,null,undefined,symbol (ECMAScript 2016新增)
。
falsy 值 (虚值) 是在 Boolean 上下文中认定为 false 的值,在JavaScript只有 七个 falsy 值。
特别要说明的是,除了这七个对象全是真值,如new Number 和new Boolean 都是真值。
let b = new Boolean(false);i f(b){ //会执行到这里。 }
toString规则:其他类型的值转换为字符串类型的操作
ToPrimitive规则:对象类型数组转为原始类型的操作
Uncaught TypeError: Cannot convert object to primitive value
기본 유형(기본 유형, 기본 데이터 유형, 원시 데이터 유형)은 객체도 메소드도 아닌 데이터입니다. JavaScript에는 7가지 유형이 있습니다: string, number, bigint, boolean, null, 정의되지 않음, 기호(ECMAScript 2016의 새로운 기능)
.
undefin힌정되지 않음 - 원래 값 NaN NaN - 숫자가 아닌 값
[] == [] [] == ![] [null] == false
Uncaught TypeError: Cannot Convert object를 발생시킵니다. 기본 값으로
🎜🎜🎜🎜🎜🎜ToNumber 규칙🎜🎜🎜🎜null => 0🎜🎜undefine => NaN🎜🎜"123"=>123 "12ssd"=>NaN ""= >0🎜🎜false => 0 true=>1🎜🎜array, object ToPrimitive🎜🎜🎜🎜🎜🎜ToBoolean rule🎜🎜🎜🎜js의 7가지 거짓 값(가상 값)은 false이고 다른 것들은 사실입니다🎜🎜🎜🎜🎜암시적 변환🎜🎜위의 지식 포인트를 이해하면 JS 암시적 변환을 단번에 무너뜨릴 수 있습니다. 🎜== 的过程
(优先换成数字、字符串)+的过程
(优先换成字符串、数字)-的过程
(转换成数字)
这个就很简单了,全部用ToNumber规则转换成数字我们根据以上所学看几个笔试题。如果你都知道结果,就不用看我的废解释了。
[] == [] [] == ![] [null] == false
第一个,==
左右都是对象,比较引用地址,这个两个不同的实例,肯定不相等啊。
第二个,!的优先级高于==
,所以先 [] 是真值,求非当让是false了,转成数字0,==
左是对象右是数字,对象使用ToPrimitive规则转换成""
,再用ToNumber规则就转成0了,判断为相等。
第三个,[null]ToPrimitive再ToNumber规则就转成0,false也转成0。
var a = 1; var b = "3"; var obj1 = { i:1, toString:function() { return "1"; }, valueOf:function() { return 1; } }; var obj2 = { i:1, toString:function() { return "2"; } }; var obj3 = { i:1, valueOf:function() { return 3; } }; var obj = { i:1, }; var objE = { i:1, valueOf:function() { return []; }, toString:function() { return {}; } }; a+b a + obj a + objE a+obj1 a+obj2 a+obj3 b+obj1 b+obj2 b+obj3 a==obj2 a==obj1
这道题比较简单你只要熟练掌握我上面说的那几个知识点可以了。下面直接写出结果啦。
a + b //"13" a + obj //"1[object Object]" a + objE //Uncaught TypeError: Cannot convert object to primitive value a+obj1 //2 a+obj2 //"12" a+obj3 // 4 b+obj1 //"31" b+obj2 //"32" b+obj3 //“33” a==obj2 //false a==obj1 //true
最后提一个比较奇葩的题目。
定义一个变量a,使得下面的表达式结果为true
a == 1 && a == 2 && a == 3
这里我简单提示下,a要是一个对象,重写valueOf方法,让它每次隐式转换的时候,调用时i++。
valueOf()在Object上默认返回的是对象不是原始类型,它会再调用toString。所以只要重写toString也可以。
如果还是没有思路,你们可以去看下这道题的文章原文从一道面试题说起—js隐式转换踩坑合集。
推荐教程:《JS教程》
위 내용은 프런트엔드 작성 test-JS 암시적 변환 문제의 함정의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!