zoukankan      html  css  js  c++  java
  • 类型和原生函数及类型转换(三:终结js类型转换)

    • Number()
    • parseInt()
    • parseFloat()
    • Boolean()
    • String()
    • toString()

     一、显式类型转换

    -------Number()函数把对象的值转换为数字。(全局函数)

    如果对象的值无法转换为数字,那么 Number() 函数返回 NaN。

    语法:

    Number(object)
    //objert可选。一个 JavaScript 对象。如果没有提供参数,则返回0。

    转换规则:

    将字符串类型数字转换成数字类型(Number)的数。

    可以将Boolean类型值转换成0或1;不可以将字符串的“true”和“false”转换成数字,而是转换成NaN。

    可以将空字符串“”、空数组[]和null换成0。

    可以将Date对象转换成1970 年 1 月 1 日至今的毫秒数。

    可以将数组长度为1的数组,且第一个元素是数字的数组转换成该数字元素(可以是字符串类型)的数字类型数字。

    其他一切值都转换成NaN。

    -------parseInt()函数可解析一个字符串,并返回一个整数。(全局函数)

     语法:

    parseInt(string, radix)

    转换规则:

    将小数做取整操作,不做四舍五入换算。

    可以操作字符串类型的数字,包含开头数字开头的字符串(截断)。

    其他值返回NaN。

    例外:可以将非空数组,且第一个元素为数字的数组做相应的操作(这里是因为内部发生隐式转换)

    parseInt()方法的第二个参数可以设置转换基底,既可以对操作的数字进行进制转换。

     -------parseFloat()函数可解析一个字符串,并返回一个浮点数。(全局函数)

    语法:

    parseFloat(string)

    转换规则:

    将字符串数字转换成数字类型,即原数。

    可以操作数字开头的字符串(截断)。

    其他值返回NaN

    例外:可以将非空数组,且第一个元素为数字的数组做相应的操作(这里是因为内部发生隐式转换)

      -------String()函数把对象的值转换为字符串。(全局函数)

     语法:

    String(object)

    转换规则:

    除了自定义的对象以外,所有值都能转换成字符串形式。也就是执行Object.prototype.toString.call()方法的时候返回“[object Object]”的对象类型,采用String()进行类型转换时还是返回“[object Object]”。

    其他的都能被转换成字符型时的参数:

    function fn(){return 1;} ----> String(fn) -----> "function fn(){return 1;}"

    var arr = new Array(1,2,3); -----> String(arr); -----> "1,2,3"

    var reg = /^[a-zA-Z]+$/ig; -----> String(reg); -----> "/^[a-zA-Z]+$/gi"

    var date = new Date(); ----> String(date); -----> "Fri Mar 08 2019 17:57:52 GMT+0800 (中国标准时间)"

    var bool = true; -----> String(bool); -----> "true"

    var num = 123; -----> String(num); -----> "123"

    console.log(String(undefined)); -----> "undefined"

    console.log(String(null)); ------> "null"

    String() - String("") -------> ""

       -------toString() ===>Number、Boolean、Array、RegExp 内置对象修重写了Object对象原型上这个方法,操作结果同等与String()方法对这些类型的值做转换操作。有部分功能有些改变。

     可以理解为这些对象将String()封装到了私有对象原型上的toString()方法上了。

    转换规则:

    undefined和null不能使用这个方法(思考:语法-包装类),强行使用会报错;

    当Number对象调用toString(radix)时,可以使用ardix参数指定进制转换,类似parseInt()方法的功能。

    var a = 10; var b = 8;

    a.toString(16); --->"a";

    b.toString(8);---->"10"

     -------Boolean()将所有数据类型的值转换成boolean类型,除了undefined、null、NaN、""、0、false这六个值以外都是转换成true,值得注意的是字符串“false”返回的也是true。

     二、隐式类型转换

    -------isNaN() :检测参数是否是非数值。是非数值返回true,反之false。

    原理:先将参数用Number()转换成数字类型(number),如果转换失败即值为NaN,转换成功即为数值,再将值与NaN进行判断,Number()返回NaN时,isNaN则返回true。

    -------++ / --   + / -

             一元正负的隐式转换:

     原理:加加与减减的操作会先将要执行加减的值类型进行类型转换,即Number()操作。再进行加加减减的操作,并且返回一个number类型的结果(值)。

     将任意数据类型的数据进行(+/-)正负操作时,原理同上。

    ------- +

             加号的隐式转换:

     原理:当两侧的数据类型其中有一个是string类型,就会将非string类型的数据进行String()操作,在执行拼接操作。

    ------- -*/% 

             减号、乘号、除号、摩尔的隐式类型转换:

     原理:在执行对应操作之前,先将两侧的数据都执行Number()的数据类型转换操作。

    ------- && || !

             与、或、非的隐式类型转换:

     原理:在条件运算之前,先将所有值都执行布尔类型转换Boolean(),再进行条件运算。

    ------- <  >  <=  >=

             比较符的隐式类型转换:

    原理:比较的两个值其中有一个是数字的话,就将另一个执行Number(),再执行比较运算。

    字符串与字符比较其比较的是ascll码。(比较规则是逐个字符比较,直到比较出大小就返回结果)

    所有含有NaN的大小比较最终的返回值都是false。

    null >= 0 为 true 的这种比较结果,再ECMAScript中还规定,如果<为false,则 >= 为true。

    下面的内容了解就好:比较对象是否相同可以采用JSON.stringify(obj)手动转换成字符串来实现比较,除了能被Number()转换成数字以外的值都会在Number()转换时变成NaN,所以都会返回false,至于>= 这个机制不在隐式类型转换机制内。

    var a = {}, b = {};
    a > b -------> false;

    a < b -------> false;
    a == b -------> false;

    a >= b ------> true;

    b >= a ------> true;

    这就是当 < 判断为false时,就会默认 >= 为false。

    ------- == !=

             等于,非等于的隐式类型转换:

    原理:正常情况下都是将对比数转换成Number类型在进行比较。

    如果x或y中有一个为NaN,则返回false;

    如果x或y皆为null或udefined中的一种类型,则返回true(null == undefined // true),否则返回false(null == 0 // false)。

    部分内容在大小比较原理中一起阐述了。

    ------- [] == ![] 的比较运算:

    原理:首先[]为对象,则调用ToPrimitive函数将其转换为字符串“”,对于右侧的![],首先进行显示类型转换(boolean),将其转换成false。然后在比较运算中,会将运算两侧的运算对象都转换成数值类型,及转换成0,因此最终返回true。

    ------- === !== 不进行隐式类型转换,直接比较两个值是否完全相同。

  • 相关阅读:
    ubuntu实时显示网速cpu占用和内存占用率
    删除以....开头的所有文件
    0.0.....1 至 0.99.......9 之间正则
    引入腾讯视频播放,可控制是否暂停播放
    解决微信小程序textarea层级太高遮挡其他组件的问题
    查看某分支推送记录
    小程序下载canvas生成图片
    微信小程序企业付款到个人
    秒 转化为 时:分:秒 ------- 类似倒计时
    iOS--崩溃日志的格式化分析---格式化crash日志
  • 原文地址:https://www.cnblogs.com/ZheOneAndOnly/p/10497583.html
Copyright © 2011-2022 走看看