javaScript零散知识点

js类型转换

偶然在网上看到张很有意思的图,输出结果可能很多人意想不到。(图就不放了直接看控制台输出吧,哈哈哈!)

// 在控制台输入左边代码                可得到右边值
typeof NaN                         // number
9999999999999999                   // 10000000000000000
0.5 + 0.1 === 0.6                  // true
0.2 + 0.1 == 0.3                   // false
Math.max()                         // -Infinity
Math.min()                         // Infinity
[] + []                            // ""
[] + {}                            // [object Object]
{} + []                            // 0
true + true                        // 2
true - true                        // 0
true == 1                          // true
true === 1                         // false
(! + [] + [] + ![]).length         // 9
9 + "1"                            // "91"
91 - "1"                           // 90
[] == 0                            // true

有被某些值惊到吗,哈哈哈!

那么为什么会输出这样子的结果呢,这就涉及到了js的弱类型语言特性。就是因为这一特性,导致在某些情形下会对数据进行隐式的转换,也就造就了上述代码中的结果。

那么js是弱类型语言也就意味着可以不用提前声明变量的类型,而在程序运行的过程中类型会被自动确定。也就是说你可以在 init的时候定义变量a为字符串,再后续填充数据的时候可以将其赋值一个对象,but 不建议这么写,尽量保持数据类型的统一,否则代码运行过程中可能会报错。

话不多说,开始类型转换。

1. 显式转换

转字符串:String()   /  toString()

转数字:   Number()    /  parseInt()   /   parseFloat()

转布尔:  Boolean()

2. 隐式转换

不得不说的 toPrimitive,在MDN文档中是这么解释的:

Symbol.toPrimitive 是一个内置的 Symbol 值,它是作为对象的函数值属性存在的,当一个对象转换为对应的原始值时,会调用此函数。

该函数被调用时,会被传递一个字符串参数 hint ,表示要转换到的原始值的预期类型。 hint 参数的取值是 "number""string" 和 "default" 中的任意一个。

(1)type值为string:

  1. 先调用objtoString方法,如果为原始值,则return,否则进行第2步;
  2. 调用objvalueOf方法,如果为原始值,则return,否则进行第3步;
  3. 抛出TypeError 异常

(2)type值为number:

  1. 先调用objvalueOf方法,如果为原始值,则return,否则进行第2步;
  2. 调用objtoString方法,如果为原始值,则return,否则第3步;
  3. 抛出TypeError 异常

(3)type值为default:

  1. 该对象为Date,则type被设置为string;
  2. 否则,type被设置为number
  • 转为Number:

null => 0 ; undefined => NaN;  true => 1;    false => 0;  "" => 0;  字符串转为数字时遵循数字常量规则,转换失败则为NaN;其余遵守toPrimitive规则

  • 转为String:
String(null)                 // 'null'
String(undefined)            // 'undefined'
String(true)                 // 'true'
String(1)                    // '1'
String(-1)                   // '-1'
String(0)                    // '0'
String(-0)                   // '0'
String(Math.pow(1000,10))    // '1e+30'
String(Infinity)             // 'Infinity'
String(-Infinity)            // '-Infinity'
String({})                   // '[object Object]'
String([1,[2,3]])            // '1,2,3'
String(['koala',1])          //koala,1
  • 转为Boolean:

undefiined,null,NaN,"",0,+0,-0转为false,其余皆为true。

数据在逻辑判断和逻辑运算中会隐式的转为boolean;

有加法运算符,但是没有字符串时会优先转换为number,其余运算符都会转为number;

加法运算,有一个值是字符串时,另一个值非字符串,则后者转为字符串;

'2' + {}              // "2[object Object]"
'2' + []              // "2"
'2' + function (){}   // "2function (){}"
'2' + ['koala',1]     // 2koala,1


2 + {}              // "2[object Object]"
2 + []              // "2"
2 + function (){}   // "2function (){}"
2 + ['koala',1]     // 2koala,1

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值