Open YBFACC opened 4 years ago
在日常使用if等判断语句时,你会碰到隐式转化。例如以下的例子👇
if(""){ console.log('true') }
所以了解类型转化也成了我们的必备技能。
所有基本类型的值都是不可改变的。但需要注意的是,基本类型本身和一个赋值为基本类型的变量的区别。变量会被赋予一个新值,而原值不能像数组、对象以及函数那样被改变。
这是我在第一次使用js碰到的问题。
let str = 'abcdefg' for (let i = 0; i < str.length; i++) { str[i] = 'A' } console.log(str)//abcdefg
从 str 不可变,可以验证基本类型的值不可变。
str
falsy 值 (虚值) 是在 Boolean 上下文中认定为 false 的值
falsy
Boolean
js中只有以下7个Falsy值:
原始值到布尔值。
除了 Falsy 其他的都转化为 true 。
Falsy
true
原始值转化为字符串。
相当于 原始值+“”
原始值+“”
原始值转化为数字。
Boolean:true=>1、 false=>0
String:转化为数字或者 NaN 。
String
null
undefined
new Object()
Number
BigInt
Symbol
这里有3个函数可能会影响结果。
Symbol.toPrimitive
toString()
valueOf()
一个对象可被转换为原始值。该函数被调用时,会被传递一个字符串参数 hint ,表示要转换到的原始值的预期类型。 hint 参数的取值是 "number"、"string" 和 "default" 中的任意一个
hint
"number"
"string"
"default"
举个栗子
返回一个表示该对象的字符串。
注意⚠️ toString 在不同类型中表现不同。(数组、函数等都会重写 toString 方法)
返回值为该对象的原始值。
注意⚠️ valueOf 在不同类型中表现不同。(数组、函数等都会重写 valueOf 方法)
valueOf
必须使用 Number.isNaN() 或 isNaN() 函数。
Number.isNaN()
isNaN()
===:进行比较时,不会类型转化。
==:进行比较时,会类型转化。
如果 x 或 y 中有一个为 NaN,则返回 false;
NaN
false
如果 x 与 y 皆为 null 或 undefined 中的一种类型,则返回 true(null == undefined // true);否则返回 false(null == 0 // false);
如果 x,y 类型不一致,且 x,y 为 String、Number、Boolean 中的某一类型,则将 x,y 使用 toNumber 函数转化为 Number 类型再进行比较;
toNumber
如果 x,y 中有一个为 Object,则首先使用 ToPrimitive 函数将其转化为原始类型,再进行比较。
Object
ToPrimitive
此处引用来自 JavaScript 运算符规则与隐式类型转换详解
let a={name:'a'} let b={name:'a'} a==b//false a==a//true
2个都是对象时,我猜测是:比较地址引用。
发现有趣的现象[6,2,3]>[9,6]的结果为 true
[6,2,3]>[9,6]
可以看到 > 可以对数组进行比较。(按字典序返回结果)
>
PS.如果字典序排列中,你缺少了一位,缺少的这一位比比0小
MDN
JavaScript核心概念(1):类型转换
JavaScript 运算符规则与隐式类型转换详解
类型转化
在日常使用if等判断语句时,你会碰到隐式转化。例如以下的例子👇
所以了解类型转化也成了我们的必备技能。
基本数据类型和引用数据类型
所有基本类型的值都是不可改变的。但需要注意的是,基本类型本身和一个赋值为基本类型的变量的区别。变量会被赋予一个新值,而原值不能像数组、对象以及函数那样被改变。
举个例子
这是我在第一次使用js碰到的问题。
从
str
不可变,可以验证基本类型的值不可变。Falsy
falsy
值 (虚值) 是在Boolean
上下文中认定为 false 的值js中只有以下7个Falsy值:
原始值转换到原始值
原始值到布尔值。
除了
Falsy
其他的都转化为true
。原始值转化为字符串。
相当于
原始值+“”
原始值转化为数字。
Boolean
:true=>1、 false=>0
String
:转化为数字或者 NaN 。原始值转化到对象
null
和undefined
使用new Object()
转化为对象,将会创建并返回一个空对象。Boolean
、String
、Number
、BigInt
、Symbol
。对象转化到原始值
这里有3个函数可能会影响结果。
Symbol.toPrimitive
toString()
valueOf()
Symbol.toPrimitive
一个对象可被转换为原始值。该函数被调用时,会被传递一个字符串参数
hint
,表示要转换到的原始值的预期类型。hint
参数的取值是"number"
、"string"
和"default"
中的任意一个举个栗子
toString()
返回一个表示该对象的字符串。![5_change](https://cdn.jsdelivr.net/gh/YBFACC/imgeCloud@master/img/20200616162513.png)
注意⚠️ toString 在不同类型中表现不同。(数组、函数等都会重写 toString 方法)
valueOf()
返回值为该对象的原始值。
注意⚠️
valueOf
在不同类型中表现不同。(数组、函数等都会重写valueOf
方法)测试
Symbol.toPrimitive优先
转为数字时,valueOf 优先。转为字符串时,toString 优先
判断 NaN
必须使用
Number.isNaN()
或isNaN()
函数。===与==
===:进行比较时,不会类型转化。
==:进行比较时,会类型转化。
如果 x 或 y 中有一个为
NaN
,则返回false
;如果 x 与 y 皆为
null
或undefined
中的一种类型,则返回true
(null == undefined // true);否则返回false
(null == 0 // false);如果 x,y 类型不一致,且 x,y 为
String
、Number
、Boolean
中的某一类型,则将 x,y 使用toNumber
函数转化为Number
类型再进行比较;如果 x,y 中有一个为
Object
,则首先使用ToPrimitive
函数将其转化为原始类型,再进行比较。此处引用来自 JavaScript 运算符规则与隐式类型转换详解
测试
2个都是对象时,我猜测是:比较地址引用。
>比较
发现有趣的现象
[6,2,3]>[9,6]
的结果为true
可以看到
>
可以对数组进行比较。(按字典序返回结果)PS.如果字典序排列中,你缺少了一位,缺少的这一位比比0小
参考
Falsy
MDN
JavaScript核心概念(1):类型转换
Symbol.toPrimitive
JavaScript 运算符规则与隐式类型转换详解