美文网首页
红宝书之JS语法

红宝书之JS语法

作者: 楠楠_c811 | 来源:发表于2018-12-28 17:04 被阅读10次
    ECMAScript的语法大量借鉴了C及类C语言的语法。
    JS的语法特点比较多,大致如下:

    1.JS语言区分大小写
    2.标识符
    3.注释
    4.严格模式
    5.语句

    标识符

    所谓标识符就是指变量、函数、属性的名字、或者函数的参数。标识符规则:
    1.第一个字符必须是一个字母、下划线、或一个美元符号;
    2.其他字符可以是字母、下划线、美元符号或数字;
    3.标识符采用驼峰命名法。

    严格模式

    严格模式为JS定义了一种不同的解析与执行模型,在严格模式下,ECMAScript3中的一些不确定的行为将得到处理,而且对某些不安全的操作也会抛出错误。要在整个脚本中启用安全模式,可以在顶部添加代码:

    "use strict"
    

    这是一个编译指示,用于告诉引擎切换到严格模式。
    也可以在函数中定义。在函数内部的最上方包含这条指令,可以指定函数在严格模式下执行。

    funtion doSomething () {
        "use strict"
        //  函数体
    }
    
    语句

    任何时候都不要省略一条语句后面的分号,因为加上分号可以避免很多错误,如不完整的输入和压缩时如果结尾没有分号会导致压缩错误。

    关键字和保留字

    关键字可以用于表示控制语句的开始或者结束,或者用于执行特定操作。
    关键字也是语言保留的,不能用作标识符。

    还有一些不能用作标识符的保留字,有可能将来用作关键字。

    变量

    ECMASprint的变量是松散类型的,可以用来保存任何类型的数据。

    var message
    

    var 是一个关键字,后面是一个变量名,也是一个标识符。这样定义而未赋值的变量,会返回undefined。
    用var操作符定义的变量将成为定义该变量的作用域中的局部变量,如果在函数中定义,在函数被调用时,就会创建该变量并为其赋值,在函数退出后就会被销毁。
    如果省略var操作符,变量就会成为全局变量。不推荐使用这种方法。

    数据类型

    ECMAScript中有六种数据类型,五种简单数据类型也叫基本数据类型:
    1.Undefined
    2.Null
    3.Boolean
    4.Number
    5.String
    一种复杂数据类型:
    6.Object

    变量定义未赋值和变量未定义使用typeof都会打印undefined。

    typeof操作符

    因为ECMAScript是松散类型的,因此需要一种手段来检测给定变量的数据类型,所以有了typeof。

    1. typeof(1)// number
    2. typeof("1")  // string
    3. typeof(true)// boolean
    4. typeof({ }) // object
    5. typeof(null)// object
    6. typeof([ ])// object
    7. typeof(undefined)// undefined
    8. typeof(console.log)// function
    
    Undefined 类型

    这个类型只有一个值,就是undefined。
    什么时候会返回undefined
    1.定义变量未赋值
    2.函数默认返回值
    3.访问某个对象没有的属性时候
    4.没有传入实参
    5.undefined

    Null类型

    这也是只有一个值的数据类型,他的值就是null。
    null值表示一个空对象指针,这就是使用typeof(null)的时候会返回"object"的原因。
    举个小例子,这时候弹出的就是object:

            var car = null;
            alert(typeof car)
    

    为什么要定义成null,还是有一些到阿里的,如果定义的变量准备在将来用于保存对象,那么最好将变量初始化为null而不是其他值,这样直接检查null就可以知道相应的变量是否已经保存了一个对象的引用。这样可以体现它作为一个空指针。

    并且还有一点 需要特别注意。
    undefined是派生自null值的。所以这两个值的相等性测试返回为true。他们两个的区别是:null是压根儿没有这个东西,undefined是有这个东西但是没有赋值。

    alert(null == undefined); // true 
    

    但是尽管如此,他们的用处是不同的,任何时候都没有必要把一个变量的值设为undefined,但却可以设置为null。

    Boolean 类型

    这个类型有两个值:true和false。
    这两个值是区分大小写的,只有小写的才是Boolean值,首字母大写及其他形式都不是值,只是标识符。
    数据类型及对应的转换规则详细如下:

    数据类型                  转为true                 转为false
    Boolean                       true                  false
    string                 任何非空字符串               空字符串
    number     任何非零数字(包括无穷大)                0和NAN
    object                      任何对象                 null
    undefined                 不适用                   undefined
    

    为什么要了解这些转换规则呢?
    因为它对理解流程控制语句很重要,语句中会自动执行Boolean转换。看这个小例子:

    let message = "你好啊";
       if (message) {
           alert('我是true哦')
       }
    

    页面会直接alert出“我是true哦”这句话。
    原因是因为字符串直接被自动转换成了对应的Boolean值(true)。因为有这种转换,所以知道使用的变量是什么状态至关重要,如果你不小心用了一个对象而不是Boolean值,就有可能彻底改变应用程序的流程。

    Number 类型

    number 类型的值包括浮点数和整数。
    最典型的一个就是0.1+0.2等不等于0.3?
    答案是:不。因为等于0.30000000000000004。

    number类型的特点:

    1.浮点数的最高精度是17位,但是进行运算使,精度不如整数。
    ECMAScript会自动将可以转换为整数的浮点数自动转为整数。
    2.它的数值范围是Infinity(正无穷) ---- -Infinity(负无穷)
    3.NaN,一个特殊的数值,用于表示一个本来要返回数值的操作数和未返回数值的情况(这样不会报错)。
    4.数值转换。

    NaN有两个特点
    (1).任何涉及NaN的操作,都返回NaN,0除以0会返回NaN,其他语言会直接报错。
    (2).NaN和任何值都不相等,包括NaN本身。

    isNaN()

    针对NaN的特点,定义了isNaN()这个函数。
    这个函数可以接收一个任何类型的参数,来判断这个参数是否“ 不是数值”。判断原理是接收参数之后,会尝试将这个值转换为数值,某些不是数值的值会被直接转换为数值,例如,字符串"10"或Boolean值。而任何不能被转换为数值的值都会导致这个函数返回true。

            console.log(isNaN(NaN))    // true NaN和任何数值都不相等,包括它自身
            console.log(isNaN(10))     // false isNaN判断的是:是否不是一个数值,10是一个数值,所以返回false
            console.log(isNaN("10"))   // false 可以被转换为数值10
            console.log(isNaN("blue")) // true (不能被转换为数值,所以他不是数值,返回true)
            console.log(isNaN(true))   // false (可以被转换成数值1)
    

    还有一点不可思议的地方,isNaN() 也适用于对象,在基于对象调用isNaN() 函数的时候,会首先调用对象的valueOf() 方法,然后确定该方法返回的值是否可以转换为数值,如果不能,则基于这个返回值再调用toString() 方法,再测试返回值。这个过程就是ECMAScript中的一般执行流程。

    Sring 类型

    string可以使用 " " 或者 ' ' 表示,这两种写法都是有效的。
    特点如下:
    1.字符字面量
    2.字符串是不可变的,一旦创建,值不可变。
    3.有两种方法将一个值转换为字符串。
    (1)toString()方法。几乎每个值都有toString()方法,数值,布尔值,对象和字符串值等,只有null和undefined没有这个方法。
    (2) string()方法。在不知道值是不是null和undefined的情况下,可以使用转型函数string()方法。它能够将任何类型的值转换为字符串。
    string()方法规则:
    1>如果值有toString()方法,就调用这个方法并返回相应结果;
    2>如果值是null,就返回null;
    3>如果值是undefined,就返回undefined。

    多数情况下,调用toString()不用传递参数,但是在调用数值的这个方法时,可以传入一个参数,输出数值的基数。这个方法可以输出二进制,八进制,十六进制等和其他任意有效进制的字符串值。

           let num = 10;
            console.log(num.toString())    // 字符串10
            console.log(num.toString(2))   // "1010"  将十进制转换为二进制
            console.log(num.toString(8))   // "12"    将十进制转换为八进制
            console.log(num.toString(16))  // "a" 将十进制转换为8进制
            console.log(num.toString(10))  // "10" 十进制输出
    
    object 类型

    对象类型其实就是一组数据和功能的集合,可以通过new操作符来创建。object类型所具有的任何属性和方法同样存在于更具体的对象中。
    object的每个实例都具有下列属性和方法:
    (1)constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor)就是object()。
    (2)hasOwnProperty(propertyName): 用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定,例如:o.hasOwnProperty("name")
    (3)isPrototypeof(object):用于检查传入的对象是否是传入对象的原型。
    (4)propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举。与hasOwenProperty()方法一样,作为参数的属性名必须以字符串形式来指定。
    (5)toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区相对应。
    (6)toString():返回对象的字符串表示。
    (7)valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同。

    相关文章

      网友评论

          本文标题:红宝书之JS语法

          本文链接:https://www.haomeiwen.com/subject/kwddlqtx.html