JS1-基本概念

语法

ECMAScript中的一切都区分大小写

严格模式 “use strict”

  1. 为JavaScript定义了一中不同的解析和执行模型
  2. ECMAScript3中语法的一些不确定的行为得到处理,而且对于某些不安全的操作也会抛出错误。
  3. 相当于编译指示。

关键字和保留字

关键字

break         do            instanceof        typeof
case        else        new                var
catch        finnally    return            void
continue    for            switch            while    
debugger*    function    this            with    
default        if            throw
delete        in            try

保留字 ECMA-262 第3版

abstract    enum        int                short
boolean        export        interface        static
byte        extends        long            super
char        final        native            synchronized
class        float        package            throws
const        goto        private            transient
debugger    implements    protected        volatile
double        import        public

保留字 ECMA-262 第5版 非严格模式

class        enum        extends            super
const        export        import

保留字 ECMA-262 第5版 严格模式

implements    package        public
interface     private        static    
let            protected    yield
eval         arguments

变量

  • 松散类型:可以用来保存任何类型的数据。
  • 每个变量仅仅是一个用于保存值的占位符而已。
  • 未初始化的变量保存一个undefined
  • var标示符定义的变量是局部变量,如果省略var则定义的是全局变量,这种声明全局变量的做法并不推荐,在严格模式下会抛出ReferenceError错误。

数据类型

基本数据类型

  • number
  • string
  • boolean
  • null
  • undefined

    对象

  • object —- Data

    ---- Array
    ---- String
    ---- function
    

typeof 操作符 用来检测基本数据类型

对一个值使用typeof操作符可能返回下列某个字符串:

  • “undefined” —这个值是为定义的
  • “boolean” — 这个值是布尔值
  • “string” — 这个值是字符串
  • “number” —这个值是数值
  • “object” —这是值是对象或者null
  • “function” — 这个值是函数

注意:typeof 用来区分函数和其它的对象。

undefined类型

  1. 未经初始化的变量中保存一个undefined
  2. ECMAScript 第3版引入 为了正式区分空对象指针和未经初始化的变量。
  3. 未定义的变量 会抛出一个错误。
  4. 对未声明的变量调用delete不会导致错误,但是也没实际意思,在严格模式下,会发生错误。
  5. 对未声明的变量执行typeof操作符同样会返回undefined
  6. 最好显示地初始化所有变量

null类型

  1. null表示空指针
  2. undefined的值派生自null的值。

    console.log(null == undefined)
    true
    
  3. 定义变量准备在将来用于保存对象,那么最好将该变量初始化为null而不是其他值–>直接检查null的值就知道相应的变量是否保存了一个对象的引用。

Boolean类型

  1. 两个字面值:truefalse
  2. 区分大小
  3. 任何数据类型转换为布尔类型:转型函数Boolean()

    数据类型 转换为true的值 转换为false的值
    Boolean true false
    String 任何非空字符串 “”(空字符串)
    Number 任何非零数字值 0和NaN
    Object 任何对象 null
    Undefined n/a(not applicable不适用)undefined

    Number类型

  4. 使用IEEE754格式来表示整数和浮点数值

  5. 八进制 0开头
  6. 十六进制 0x开头
  7. 正零(+0)和负零(-0)被认为相等

浮点数值

  1. 浮点数值需要的内存是保存整数值的两倍
  2. 如果小数点后面没有数值或者浮点数本身就是一个整数,那么该值会被转换为整数。
  3. 极大的值或极小的值—–e表示法:e前面的数值乘以整数次幂。
  4. 将小数点后面带有6个零以上的浮点数值转换为e表示法。
  5. 在浮点数精度为17位小数,在进行算术运算时,其精度远不如整数。例如,在计算0.1+0.2的结果不是0.3,而是0.30000000000000004。(这是舍入是通病)
  6. 永远不要测试某个特定的浮点数值。

    onsole.log(0.1+0.2)
    0.30000000000000004
    
    if( 0.1 + 0.2 = 0.3){//永远不要这样做测试
        ...
    }
    

数值范围

最小整数        Number.MIN_VALUE        5e-324
最大整数        Number.MAX_VALUE        1.79769311348623157e+308
如果超过最大值,则自动转换为特殊的Infinity值
如果超过最小值,则自动转换为特殊的-InfinityNumber.NAGTIVE_INFINITY 得到 负Infinity 
Number.POSTIVE_INFINITY 得到 正Infinity
这个两个属性分别保存着-InfinityInfinity

isFinite()函数,用于检测一个数值是不是有穷的

NaN

  1. Not a Number 非数值。
  2. 表示一个未来要返回数值的操作数为返回数值的情况(这样就不会抛出错误了)。
  3. 任何涉及NaN的操作都会返回NaN
  4. NaN与任何值都不相等,包括NaN本身。
  5. isNaN()函数,判断这是参数是否”不是数值”。任何不能被转换为数值的值,都会返回—true
  6. isNaN()适用于对象,在基于对象调用isNaN()函数时,先调用对象的valueOf()方法,确定返回值是否可以转换为数值,如果不能,再调用对象的toString()方法,在测试返回值。

数值转换

Number()

转换规则:

  1. Boolean值: true–>1,false–>0;
  2. 数字值–>简单传入和返回
  3. null–>0
  4. undefined–>NaN
  5. 字符串:

    1. 只包含数字,则转换为十进制数值,前导零被忽略
    2. 包含有效的浮点,则转换为浮点数字,前导零被忽略
    3. 包含有效的十六进制,则转换为相同大小的十进制
    4. 为空->0
    5. 包含其它的格式->NaN

      Number("0xf") //15
      Number("hell")//NaN
      Number("000011")//11
      Number("true")//NaN
      Number(true)//1
      Number("")//0
      
  6. 一元字符的操作与Number()函数相同

parseInt()

  1. 如果第一个字符不是数字字符或者负号,则返回—>NaN
  2. 如果是空字符串—>NaN
  3. 如果第一个是数字,那么会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。
  4. ECMAScript 3和5在处理八进制字面值存在歧义

    parseInt("070")  //ECMAScript 3认为是56 ECMAScript 5 认为是70
    parseInt("")  //NaN
    parseInt("1234blue"); //1234
    parseInt("") // NaN
    parseInt(22.5) //22
    parseInt("OxA") //NaN
    parseInt("0xA") //10
    parseInt("0xf") //15
    
  5. 建议:无论在什么情况下,都要指明基数。
  6. parseInt(“10”,2)//2
    parseInt(“10”,8)
    8
    parseInt(“10”,10)
    10
    parseInt(“10”,16)
    16

parseFloat()

  1. 如果第一个是数字,那么会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。
  2. 字符串中第一个小数点是有效的,而第二个小数点是无效的,后面的字符将被忽略
  3. 始终会忽略前导0,十六进制的数始终转换为0,所以只解析十进制值。
  4. 如果包含可解析的整数,那么就返回整数。

    parseFloat("1234blue") //1234
    parseFloat("0xA") //0
    parseFloat("22.5") //22.5
    parseFloat("22.34.4") //22.34
    parseFloat("098.4") //98.4
    parseFloat("3.125e7") //31250000
    

String类型

  1. 表示零或多个16为Unicode字符组成的字符序列,即字符串。
  2. 双引号和单引号在ECMAScript中没有区别

字符串字面量

字面值        含义
\n            换行
\t            制表
\b            退格
\r            回车
\f            进纸
\\            斜杠
\'            单引号
\"            双引号
\xnn        以十六进制代码nn表示一个字符
\unnnn        以十六进制nnnn表示一个Unicode字符

字符串字面值可以出现在字符串中的任意位置,而且被作为一个字符来解析:

var text = "This is the letter sigma: \u03a3."
text.length //28

var text = "This is the letter sigma: ."
text.length //27

length 返回 字符数包括16位字符的数目。

如果包含双字节字符,length属性可能不会精确的返回字符串中的字符数目。

字符串特点

字符串是不可变的。

转换为字符串

  1. toString()方法
  2. null 和 undefined 没有toString()方法
    • null->null
    • undefined->undefined;
  3. 参数:输出数值的基数。默认是10进制返回

    var num = 10
    num.toString() //“10”
    num.toString(2) //“1010”
    num.toString(8) //“12”
    num.toString(16) //“a”
    num.toString(10) //“10”

    String(10) //“10”
    String(true) //“true”
    String(null) //“null”
    var value;
    String(value) //“undefined”

Object类型

  1. 对象:数据和功能的集合
  2. 在ECMAScript中,Object类型是所有它的实例基础。即,Object类型所具有的任何属性和方法也同样适用于更具体的对象。

Object对象的属性和方法

  • constructor:保存着用于创建当前对象的函数。
  • hasOwnProperty(propertyName):用于检查给定的属性在当前对象中是否存在。
  • isPrototypeOf(object):用于检查传入的对象是否是当前对象的原型。
  • propertyIsEnumerable(propertyName):用于检差给定的属性是否能够使用for-in语句来枚举。
  • toLacaleString():返回对象的字符串表示
  • toString():返回对象的字符表示
  • valueOf():返回对象的字符串、数值或布尔值表示。

操作符

一元操作符

++,–

前置:变量在求值之前改变。

后置:包含它们的语句被求值之后才执行。

一元加减操作符

+

  1. 对于数值不会产生任何影响
  2. 非数值,会像Number()函数一样执行转换。

-

  1. 用于表示负数
  2. 非数值,会像Number()函数一样执行转换。

位操作符

  1. 按内存中表示的数值的位来操作数值。
  2. ECMAScript中所有的数值都是以IEEE-754 64位格式存储,但是位操作并不直接操作64位值。
  3. 先将64位值—>32为整数—>执行操作—>64位值。
  4. 有符号数:前31位表示数值,第32位表示符号位。(0 正数 ; 1 负数)
  5. 对特殊的NaN和infinity值应用位操作,会被当成0来处理。

按位非(NOT) ~

本质: 操作数的负值减-1

按位与(AND) &

按位或(OR) |

按位异或 ^

左移 << 相当于乘2 不会影响符号位

有符号右移 >> 相当于除2 保留符号位

无符号右移 >>>

无符号右移,以0填充空位

无符号右移,会把负数的二进制当成正数的二进制。会导致无符号右移的结果非常大

布尔操作符

逻辑非 !

规则:

1.    对象-->false;
2.    空字符串-->true;
3.    非空字符串--->false;
4.    0--->true;
5.    非零数值--->false;
6.    null-->true;
7.    NaN-->true;
8.    undefined -->true;
9.    

逻辑与 &&

规则:

  1. 第一个操作数是对象—>第二个操作数
  2. 第二次操作数是对象—>在第一个操作数求值结果为true的情况下,才会返回该对象
  3. 如果两个操作数都是对象–>返回第二个操作数
  4. 一个是null–>null
  5. 一个是NaN—>NaN
  6. 一个是undefined—>undefined

**牢记:

  1. 短路操作
  2. 不能在逻辑与操作中使用未定义的值。**

    逻辑或

    规则:

  3. 第一个操作数是对象—>第一个操作数

  4. 第一个操作数的求值结果为false—>第二个操作数
  5. 如果两个都是对象—–>返回第一个对象
  6. 两个都是null—->null
  7. 两个都是NaN—->NaN
  8. 两个都是undefined—->undefined

牢记:
1.短路操作
2.利用逻辑或可以避免为变量赋予null或undefined值。
3.不能在逻辑或中出现使用未定义的值。

乘性操作符

非数值的情况下回执行自动的类型转换

乘法 *

规则

  1. 操作数都是数值的情况下,执行常规乘法。超过范围的话Infinity和-Infinity
  2. NaN–>NaN
  3. Infinity * 0 ->NaN
  4. Infinity * 非0 —>Infinity 或 -Infinity
  5. Infinity * Infinity –>Infinity
  6. 不是数值,转换为数值 Number()。

    除法 /

    规则

  7. 操作数都是数值的情况下,执行常规除法。超过范围的话Infinity和-Infinity

  8. NaN–>NaN
  9. Infinity / 0 ->NaN
  10. Infinity / Infinity –>NaN
  11. Infinity / 非0 —>Infinity 或 -Infinity
  12. 不是数值,转换为数值 Number()。

    求模 %

    规则:

  13. 操作数都是数值的情况下,执行常规求模。

  14. 有限大 % 无穷大 –>NaN
  15. 0 % 有限大 —>NaN
  16. Infinity % Infinity –>NaN
  17. 无穷大 % 有限大—->被除数
  18. Infinity % 非0 —>Infinity 或 -Infinity
  19. 被除数为0—->0
  20. 不是数值,转换为数值 Number()。

    加性操作符

    加法

    规则:

  21. 如果一个操作数是NaN–>NaN

  22. Infinity + Infinity –> Infinity
  23. -Infinity + -Infinity –> -Infinity
  24. Infinity + -Infinity –>NaN
  25. +0 + +0 –>+0
  26. -0 + -0 –> -0
  27. +0 + -0 –>+0
  28. 如果两个都是是字符串—-> 两个操作符拼接
  29. 如果只有一个字符串,将另一个转换为字符串,然后将两个字符拼接起来。
  30. 如果有一个操作符是对象、数值或布尔值,则调用他们的toString()方法,然后应用上述规则
  31. 对于undefined和null调用字符串取得字符串的”undefinied”和”null”

    减法

  32. 如果一个操作数是NaN–>NaN

  33. Infinity - Infinity –> NaN
  34. -Infinity - -Infinity –> NaN
  35. Infinity - -Infinity –>Infinity
  36. -Infinity - -Infinity —>-Infinity
  37. +0 - +0 –>+0
  38. -0 - -0 –> +0
  39. +0 - -0 –>-0
  40. 如果只有一个字符串、布尔值、null或undefined,则先在后台执行Number()函数转换为数值,在应用上述规则
  41. 如果有一个操作符是对象,则调用他们的valueOf()方法取得该对象的数值,然后应用上述规则。如果没有valueOf()方法,则调用toString()方法。

关系操作符

<、>、<=、>=

规则:

  1. 如果两个操作数都是数值–>执行比较
  2. 如果两个操作符都是字符串–>比较字符编码
  3. 一个是数值–>将另一个转换为数值,比较
  4. 一个是对象–>调用对象的valueOf()方法,如果没有valueOf()方法,则调用toString()方法。
  5. 如果是布尔值–>转换为数值,比较

注意:

大写字母的字母编码全部辖域小写字符的字符编码
toLowerCase()全部转换为小写,再比较
两个数字字符串比较

var result = "23" < "3" //true
var result = "23" < 3 //false
var result = "a" < 3 //false
var result = NaN < 3 //false
var result = NaN >= 3 //false

如何数与NaN比较,都是false

相等 == 和 不相等 !=

比较之前转换操作数规则:

  1. 一个是boolean值–>转换为数值比较
  2. 一个是字符串,另一个数数值–>字符串转换为数值
  3. 一个是对象,另一个不是–>调用对象的valueOf()方法

比较规则:

  1. null 和 undefined是相等的
  2. 不能将null和undefined转换其它任何值
  3. 有一个是NaN—>相等返回false
  4. 两个都是NaN—>向德国返回false
  5. 都是对象–>比较是不是同一对象
true == 1
true
true==2
false
undefined == 0
false
null == 0
false
undefined == null
true
false==0
true
"5"==5
true
NaN == NaN
false
NaN != NaN
true
5 == NaN
false

全等和不全等

比较之前不转换操作数。

null === undefined
false

条件操作符 ? :

boolean_expression ? true_value : false_value;

赋值操作符 =

*=
/=
%=
+=
-=
<<=
>>=
>>>=

逗号操作符

  1. 在一条语句中执行多个操作数
  2. 用于赋值
  3. 返回表达式中的最后一项

    var num = (4,1,2,3,0) //0

语句

  1. if语句
  2. do-while语句
  3. while语句
  4. for语句
    ECAMScript不存在块级作用域,因此在循环内部定义的变量也可以在外部访问到。
  5. for-in语句:精准迭代语句
    for (property in expression)

        statement
    
    for(var propName in window){
        document.write(propName)
    }
    

    for-in循环输出的属性名的顺序是不可预测的。
    迭代的对象的变量值为null和undefined,for-in语句会抛出错误。
    ECAMScript 5中对这种情况,不抛出错误,只是不执行循环体。

  6. label语句:在代码中添加标签
    label:statement

  7. break和continue语句
  8. with语句:将代码的作用域设置到一个特定的对象中。

    with (expression) statement;
    

    严格模式下不允许使用with语句。

  9. switch语句
    switch语句可以使用任何数据类型
    case的值不一定是常量,可以是变量,甚至是表达式
    比较的时候,使用的是全等操作符。

函数

function functionName(arg0,arg1,...argN){
    statements
}
  1. 不必指定返回值
  2. 任何函数在任何时候都可以通过return语句后要返回的值来实现返回值。
  3. 位于return语句后的代码不会执行
  4. 严格模式下:

    • 不能吧函数命名为eval和arguments
    • 不能把参数命名为eval和arguments
    • 不能出现两个函数命名参数同名的情况。

      理解参数

  5. ECMAScript中参数在内部是用一个数组来表示的。函数接受到始终是这个数组,而不关心数组中包含哪些参数。

  6. 在函数体内通过arguments对象来访问这个参数数组,从而获取传递给函数的每一个参数。
  7. arguments[0]…arguments.length
  8. arguments的值永远与对应的命名参数值保持同步。但是不是说两个值会访问相同的内存空间,他们的内存空间是互相独立的,值保持同步。
  9. 没有传递值的命名参数将自动赋予undefined值。
  10. 严格模式下:重写arguments的值会导致语法错误。

没有重载

通过检查传入函数中参数的类型和数量并作出不同的反应,可以模仿方法的重载。

文章目录
  1. 1. 语法
    1. 1.1. ECMAScript中的一切都区分大小写
    2. 1.2. 严格模式 “use strict”
    3. 1.3. 关键字和保留字
      1. 1.3.1. 关键字
      2. 1.3.2. 保留字 ECMA-262 第3版
      3. 1.3.3. 保留字 ECMA-262 第5版 非严格模式
      4. 1.3.4. 保留字 ECMA-262 第5版 严格模式
  2. 2. 变量
  3. 3. 数据类型
    1. 3.1. 基本数据类型
    2. 3.2. 对象
    3. 3.3. typeof 操作符 用来检测基本数据类型
    4. 3.4. undefined类型
  4. 4. null类型
  5. 5. Boolean类型
  6. 6. Number类型
    1. 6.1. 浮点数值
    2. 6.2. 数值范围
      1. 6.2.1. isFinite()函数,用于检测一个数值是不是有穷的
    3. 6.3. NaN
    4. 6.4. 数值转换
      1. 6.4.1. Number()
      2. 6.4.2. parseInt()
      3. 6.4.3. parseFloat()
  7. 7. String类型
    1. 7.1. 字符串字面量
    2. 7.2. 字符串特点
    3. 7.3. 转换为字符串
  8. 8. Object类型
    1. 8.1. Object对象的属性和方法
  9. 9. 操作符
    1. 9.1. 一元操作符
      1. 9.1.1. ++,–
    2. 9.2. 一元加减操作符
      1. 9.2.1. +
      2. 9.2.2. -
    3. 9.3. 位操作符
      1. 9.3.1. 按位非(NOT) ~
      2. 9.3.2. 按位与(AND) &
      3. 9.3.3. 按位或(OR) |
      4. 9.3.4. 按位异或 ^
      5. 9.3.5. 左移 << 相当于乘2 不会影响符号位
      6. 9.3.6. 有符号右移 >> 相当于除2 保留符号位
      7. 9.3.7. 无符号右移 >>>
    4. 9.4. 布尔操作符
      1. 9.4.1. 逻辑非 !
      2. 9.4.2. 逻辑与 &&
      3. 9.4.3. 逻辑或
    5. 9.5. 乘性操作符
      1. 9.5.1. 乘法 *
      2. 9.5.2. 除法 /
      3. 9.5.3. 求模 %
    6. 9.6. 加性操作符
      1. 9.6.1. 加法
      2. 9.6.2. 减法
    7. 9.7. 关系操作符
      1. 9.7.1. <、>、<=、>=
    8. 9.8. 相等 == 和 不相等 !=
    9. 9.9. 全等和不全等
    10. 9.10. 条件操作符 ? :
    11. 9.11. 赋值操作符 =
    12. 9.12. 逗号操作符
  10. 10. 语句
  11. 11. 函数
  12. 12. 理解参数
    1. 12.1. 没有重载
,