• 第三章 基本概念


    ECMAScript中有5种简单数据类型:Undefined、Null、Boolean、Number和String,还有一种复杂的数据类型Object

    typeof操作符

    "undefined"——如果这个值未定义;
    "boolean"——如果这个值是布尔值;
    "string"——如果这个值是字符串;
    "number"——如果这个值是数值;
    "object"——如果这个值是对象或null;
    "function"——如果这个值是函数。
    调用typeof null会返回"object" 因为特殊值null会被认为是一个空的对象引用。

    undefined

    Undefined类型只有一个值,即undefined,在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined;
    但是 var message;alert(message);会显示undefined 但是alert(age);未声明的变量会导致错误。
    对于未声明的变量,只能执行typeof操作,但是对于未初始化的变量和未声明的变量使用typeof都会返回undefined。

    null

    Null类型也只有一个值null,null表示一个空指针对象,而这也正是typeof检测null值会返回"object"的原因
    如果定义的变量准备字将来用于保存对象,最好将该变量初始化为null而不是其他值,这样只要直接检查null值就可以知道相应的变量是否已经保存了一个对象的引用:
    if(car!=null){
    }
    实际上,undefined值是派生自null值
    alert(null==undefined); //true

    Boolean

    Boolean类型有true和false两个值,true不一定为1,false不一定为0.
    Boolean类型的值区分大小写,也就是说,True和False都不是Boolean值,只是标示符。
    ECMAScript所有类型的值都有与这两个Boolean值等价的值,使用Boolean()调用转型函数
    数据类型 转化为true 转化为false
    Boolean true false
    String 非空字符串 "" 空字符串
    Number 任何非零数字值(包括无穷大) 0和NaN
    Object 任何对象 null
    Undefined n/a(不适用) undefined

    Number

    Number类型
    八进制第一位必须是0如果超出范围则前面的0会被忽略当做十进制解析
    var a = 070;//八进制的56
    var a = 079;/无效的八进制数值——解析为79
    var a = 08; //无效的八进制数值——解析为8
    八进制字面量在严格模式下是无效的,会导致JavaScript引擎抛出错误
    十六进制字面值前两位必须是0x
    进行计算时,所有八进制和十六进制的数值都将被转换成十进制数值。

    浮点数值需要的内存空间是保存整数值的两倍,因此ECMAScript会不失时机的将浮点数值转换为整数值。即1. ,和10.0 这样的数会被转换为整数。
    可以使用科学计数法 3.12e7 即31200000
    浮点数的最高精度是17位小数,但精度不如整数0.1+0.2=0.30000000000000004,这个误差会导致无法测试特定的浮点数值。所以不要这样做if(a+b==0.3){} 永远不要测试某个特定的浮点数值。

    Number.MAX_VALUE=1.7976931348623157e+308 Number.MIN_VALUE=5e-324超过范围会被转化为-Infinity和Infinity
    正负无穷不能参与计算。判断一个数值是不是有穷的用isFinite()函数。
    Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINITY 保存着-Infinity和Infinity

    NaN表示一个本来要返回数值的操作数为返回数值的情况,ECMAScript中0/0会返回NaN,正数除以0返回Infinity,负数除以0返回 -Infinity;涉及NaN的操作(比如NaN/10)都会返回NaN,NaN与任何值都不相等包括NaN本身。
    alert(NaN==NaN);//false
    isNaN()判断是否“不是数值”
    alert(isNaN(NaN)); //true
    alert(isNaN(10)); //false
    alert(isNaN("10")); //false(可以被转换成数值10)
    alert(isNaN("blue")); //true(不能被转换为数值)
    alert(isNaN(true)); //false (可以被转换成数值1)
    isNaN()确实也使用于对象,在基于对象调用isNaN()时,会首先调用对象的valueOf()方法,然后确定该方法返回的值是否可以转换为数值,如果不能,则基于这个返回值再调用toSting() 方法,再测试返回值,这个过程也是ECMAScript种内置函数和操作符的一般执行过程。

    数值转换

    Number()用于任何数据类型,parseInt()和parseFloat()用于把字符串转换成数值,这3个函数对于同样的输入会有返回不同的结果。
    Number()函数的转换规则
    如果是Boolean值,true和false分别被转换为1和0;
    如果是数字值,只是简单的传入和返回。
    如果是null值,返回0;
    如果是undefined,返回NaN。
    如果是对象,会首先调用对象的valueOf()方法,然后按照上面的规则转换,如果结果是NaN,则基于这个返回值再调用toSting() 方法,再转换。
    如果是字符串,遵循下列规则:
    如果字符串中只包含数字,则将其转换为十进制数值,即”1“变成1,”123“变为123,”011“变为11(前面的0忽略);
    如果包含有效的浮点格式如”1.1“则将其转换为对应的浮点数值(前面的0忽略);
    如果包含十六进制如”0xf“,会转换为相同大小的十进制整数;
    如果是空的,返回0;
    如果包含除上述格式外的其他字符,转换为NaN。
    parseInt()函数会忽略字符串前面的空格,直到找到第一个非空格字符。如果第一个字符不是数字字符或者负号,parseInt()会返回NaN。parseInt("123lue");//123 parseInt("");//NaN parseInt("oxA"); //10(十六进制) parseInt("11.1");//11
    可以使用parseInt("0xf",16);指定基数为16 可以这样parseInt("f",16);//15
    parseFloat()字符串的第一个小数点是有效的,第二个是无效的。会忽略前面的0,只解析十进制值,十六进制的字符串会被转换成0.

    String类型

    单双引号完全相同。
     xnn unnnn 会被当做一个字符来解析
    字符串是不可变的
    转化为字符串:数值、布尔值、对象、字符串都有toString()方法,但null和undefined没有,多数情况下,调用toString()方法不必传递参数,但是在调用数值的toString()方法时可以传递。默认以十进制格式返回。num.toString(2); 以二进制返回
    String()可以转化任何类型的值,规则:
    如果有toString()方法,则调用该方法(无参数)并返回相应的结果;
    如果是null,则返回"null";
    如果是undefined,则返回"undefined";
    Object类型具有如下属性和方法:
    constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数就是Object();
    hasOwnProperty(propertyName):用于检查给定的属性在当前对象的实例中(而不是在实例的原型中)是否存在。
    isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型;
    propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举;
    toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应;
    toString():返回对象的字符串表示。
    valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同。

    操作符

    ++、--不仅适用于整数,还适用于字符串、布尔值、浮点数值和对象
    var s1 ="2" s1++ //变成3,对于包含有效数字字符的字符串,先转化为数字再执行加减1
    var s2="a" s1++//NaN 不包含有效数字字符的字符串
    var b="false" b++//1 false转化为0,true为1;

    一元加放在数值前面对数值不会产生任何影响,一元减会将数值变为负

    短路操作&&找出第一个为false的值,否则放回最后一个数; ||找出第一个为true的值,否则返回最后一个数。

    乘法

    有一个为NaN 返回NaN;
    Infinity与0相乘,为NaN;
    Infinity与非0相乘,结果为Infinity或-Infinity;
    Infinity与Infinity相乘,为Infinity;
    如果有操作数不是数值,调用Number()将其转换为数值,再应用上面的规则

    除法

    有一个为NaN,结果为NaN;
    Infinity被Infinity除,结果为NaN;
    0被0除,NaN;
    非零的有限数被0除,结果是Infinity或-Infinity;
    Infinity被任何非0除,结果是Infinity或-Infinity;
    如果有操作数不是数值,调用Number()将其转换为数值,再应用上面的规则

    求模

    被除数是无穷大而除数是有限大的数值,NaN;
    被除数是优先打除数是0,NaN;
    Infinity被Infinity除,NaN;
    被除数是有限大的数值而除数是无限大的数值,结果是被除数;
    被除数是0,结果是0;
    如果有操作数不是数值,调用Number()将其转换为数值,再应用上面的规则;

    加法

    Infinity加-Infinity 结果是NaN;
    两个都是字符串,则拼接起来,一个是字符串,将另一个转换为字符串再拼接起来
    有一个是对象、数值、或布尔值,则调用他们的toString()方法取得相应的字符串,再使用前面的规则,对于undefined和null,则分别调用String()取得字符串"undefined"和"null"

    减法

    一个操作数为NaN,结果是NaN;
    Infinity减Infinity,结果是NaN;
    -Infinity减-Infinity,结果是NaN;

    相等操作符

    如果一个操作数的布尔值,先false转换为0,true转换为1;
    一个是字符串,另一个是数值,现将字符串转换为数值;
    如果一个操作数是对象,另一个不是,调用对象的valueOf()方法,用得到的基本类型值按照前面的规则进行比较;
    null和undefined相等;
    比较相等前,不能将null和undefined转换成其他任何值;
    如果一个操作数是NaN,返回false,!=返回true。两个操作数都是NaN,返回false;
    两个操作数都是对象,则比较他们是不是同一个对象,指向同一个对象,返回true,否则,返回false;
    =在未经转换就相等的情况下返回true。
    null
    undefined //true null
    =undefined //false

    switch比较值的时候使用的是===操作符因此不会发生类型转换

    arguments对象的值永远与对应命名参数的值保持同步。
    function doAdd(num1,num2){
    arguments[1] = 10;
    alert(arguments[0]+num2);
    }
    也就是说num2的值也会变成10。但是arguments[1]和num2不是访问相同的内存空间,它们的内存空间是独立的,但它们的值会同步。如果只传入了一个参数,那么为arguments[1]设置的值不会反映到命名参数中。arguments对象的长度是由传入的参数个数决定的,不是由定义函数时的命名参数的个数决定的。没有传递值的命名参数将自动被赋予undefined值,这就跟定义变量没初始化一样。即doAdd()函数传递了一个参数,num2中就会保存undefined值。在严格模式下,前面例子里的赋值无效。ECMAScript中所有参数传递的都是值,不能通过引用传递参数。

    ECMAScript没有重载,后面的会覆盖前面的,通过检查参数,可以模仿重载。

  • 相关阅读:
    python hashlib模块
    OS模块-提供对操作系统进行调用的接口
    For循环
    python --time()函数
    使用docker部署prometheus和grafana 并监控mysql 配置告警
    记换换回收一个js逆向分析
    mitmproxy 在windows上的使用
    elasticsearch_dsl 的nested
    利用谷歌插件破解今日头条的新闻ajax参数加密,新手都能懂
    aiohttp爬虫的模板,类的形式
  • 原文地址:https://www.cnblogs.com/frontor/p/4720837.html
Copyright © 2020-2023  润新知