[关闭]
@aymax 2018-04-05T06:21:12.000000Z 字数 13307 阅读 1168

第三章

高设笔记



基本语法

  • 即变量、函数、属性的名字,或者函数的参数。
  • 第一个字符必须是字母、下划线(_)、或者美元符号($)
  • 其他字符可以是上面三种加上数字
  • 一般采用驼峰命名法
  • 不能把把关键字、保留字、true、false 和 null 用作标识符

单行注释

  1. // 我是单行注释

多行注释

  1. /*
  2. *
  3. * 我是多行(块级)注释
  4. *
  5. */
  • 语句 ;
  • 代码块 { }

关键字

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

保留字

- - - -
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
  1. var message;

定义了一个名为 message 的变量,值为 -- undefined

  1. function test() {
  2. var message = "hi"; // 局部变量
  3. }
  4. test();
  5. alert(message); // 错误

再函数内用 var 操作符定义的变量为局部变量

  1. function test() {
  2. message = "hi"; // 全局变量
  3. }
  4. test();
  5. alert(message); // 弹出 "hi"

在函数内定义一个变量 message 省略 var,message 会作为全局变量被定义,不过不建议这种做法


数据类型

简单数据类型

  • Undefined
  • Null
  • Boolean
  • Number
  • String

复杂数据

  • Object

可以用 typeof 操作符检测

返回值 含义
"undefined" 未定义
"boolean" 布尔值
"string" 字符串
"number" 数值
"object" 对象或 null
"function" 函数
  1. var message; // 这个变量声明之后默认取得了 undefined 值
  2. // 下面这个变量并没有声明
  3. // var age
  4. alert(message); // "undefined"
  5. alert(age); // 产生错误
  6. alert(typeof message); // "undefined"
  7. alert(typeof age); // "undefined"

对未声明的变量执行 typeof 操作符也会返回 undefined

  1. alert(null == undefined); //true
数据类型 true false
Boolean true false
String 任何非空字符串(空格也算) ""(空字符串)
Number 任何非零数值(正、负无穷也算) 0 和 NaN
Object 任何对象 null
Undefined N/A undefined

应用

  1. var message = "Hello world!";
  2. if (message) {
  3. alert("Value is true");
  4. }

Number 类型

最基本的是十进制数整数

  1. var intNum = 55; // 整数

八进制数 前缀为 0 (严格模式下无效)

  1. var octalNum1 = 070; // 八进制的 56
  2. var octalNum2 = 079; // 无效的八进制数值——解析为 79
  3. var octalNum3 = 08; // 无效的八进制数值——解析为 8

十六进制数 前缀为 0x

  1. var hexNum1 = 0xA; // 十六进制的 10
  2. var hexNum2 = 0x1f; // 十六进制的 31

在进行算术计算时,所有以八进制和十六进制表示的数值终都将被转换成十进制数值

数值中必须包含一个小数点,并且小数点后面必须至少有一位数字,例

  1. var floatNum1 = 1.1;
  2. var floatNum2 = 0.1;
  3. var floatNum3 = .1; // 有效,但不推荐

如果小数点后面没有跟数字,保存的时候会转化为整数

  1. var floatNum1 = 1.; // 小数点后面没有数字——解析为 1
  2. var floatNum2 = 10.0; // 整数——解析为 10

很大或者很小的数,用科学表示法表示,可以是小写 e 也可以是大写 E

  1. var floatNum = 3.125e7; // 等于 31250000

在默认情况下,ECMASctipt 会将那些小数点后面带有 6 个零以上的浮点数值转换为以 e 表示法 表示的数值(例如,0.0000003 会被转换成 3e-7)。
计算机存储数据是用二进制的,浮点数的最高精度是 17 位小数,即浮点数可以精确表示 0.25,但是不可以精确表示 0.1 和 0.2,例 0.1 + 0.2 = 0.30000 00000 00000 04 不等于0.3

  1. console.log( 0.2 + 0.1 == 0.3); // false

最小/大值

  1. console.log(Number.MIN_VALUE); // 5e-324
  2. console.log(Number.MAX_VALUE); // 1.7976931348623157e+308

可以使用 isFinite() 函数检查是否在最大/小值之间

正/负无穷

  1. console.log(Number.NEGATIVE_INFINITY); // -Infinity
  2. console.log(Number.POSITIVE_INFINITY); // +Infinity
  1. console.log(NaN / 10); // NaN 任何涉及NaN的运算都会返回NaN
  2. console.log(NaN == NaN); // false NaN不与任何值相等,包括其本身
  • 任何数值除以非数值会返回 NaN
  • 0 除以 0 返回 NaN
  • 正数除以 0 返回 Infinity
  • 负数除以 0 返回 -Infinity

可以用 isNaN() 函数检测是否 NaN

isNaN() 在接收到一个值之后,会尝试将这个值转换为数值。某些不是数值的值会直接转换为数值,例如字符串"10"或 Boolean 值。而任何 不能被转换为数值的值都会导致这个函数返回 true。

  1. alert(isNaN(NaN)); //true
  2. alert(isNaN(10)); //false(10是一个数值)
  3. alert(isNaN("10")); //false(可以被转换成数值 10)
  4. alert(isNaN("blue")); //true(不能转换成数值)
  5. alert(isNaN(true)); //false(可以被转换成数值 1)

isNaN() 用于对象时,先调用 valueOf()方法,再调用 toString() 方法;


转换为数值

  1. console.log(Number("")); // 0
  2. console.log(Number(" ")); // 0
  3. console.log(Boolean("")); // false
  4. console.log(Boolean(" ")); // true
  1. var num1 = parseInt("1234blue"); // 1234
  2. var num1 = parseInt("blue4321"); // NaN
  3. var num1 = parseInt("12blue34"); // 12
  4. var num2 = parseInt("haha"); // NaN
  5. var num2 = parseInt(""); // NaN
  6. var num2 = parseInt(" "); // NaN
  7. var num4 = parseInt(22.5); // 22
  8. var num4 = parseInt(-22.5); // -22
  9. var num5 = parseInt("070"); // 56(八进制数) (*注)
  10. var num6 = parseInt("70"); // 70(十进制数)
  11. var num7 = parseInt("0xf"); // 15(十六进制数)

注:ES3 中 070 被识别为八进制数,转换后市十进制值 56,但是在 ES5 中,parseInt() 已经不具有解析八进制值的能力,从而将这个值当成十进制值 70

解决方法 - 指定基数

  1. console.log(parseInt("070",8)); // 56
  2. console.log(parseInt("0xAF")); // 175
  3. console.log(parseInt("0xAF",16)); // 175
  4. console.log(parseInt("AF")); // NaN
  5. console.log(parseInt("AF",16)); // 175
  1. var num1 = parseFloat("1234blue"); // 1234 (整数)
  2. var num2 = parseFloat("0xA"); // 0
  3. var num3 = parseFloat("22.5"); // 22.5
  4. var num4 = parseFloat("-22.34.5"); // -22.34
  5. var num5 = parseFloat("0908.5"); // 908.5
  6. var num6 = parseFloat("3.125e7"); // 31250000

String 类型

字面量 含义
\n 换行
\t 制表
\b 空格
\r 回车
\f 进纸
\ 斜杠
\' 单引号('),在用单引号表示的字符串中使用。例如:'He said, \'hey.\''
\" 双引号("),在用双引号表示的字符串中使用。例如:"He said, \"hey.\""
\xnn 以十六进制代码nn表示的一个字符(其中n为0~F)。例如,\x41表示"A"
\unnnn 以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F)。例如,\u03a3表示希腊字符Σ
转义之后只占一个字符长度
  1. console.log("\u03a4".length); // 1


转换为字符串

  1. var num = 10;
  2. alert(num.toString()); // "10"
  3. alert(num.toString(2)); // "1010"
  4. alert(num.toString(8)); // "12"
  5. alert(num.toString(10)); // "10"
  6. alert(num.toString(16)); // "a"
  1. var value1 = 10;
  2. var value2 = true;
  3. var value3 = null;
  4. var value4;
  5. alert(String(value1)); // "10"
  6. alert(String(value2)); // "true"
  7. alert(String(value3)); // "null"
  8. alert(String(value4)); // "undefined"

Object 类型

通过执行 new 操作符后跟要创建 的对象类型的名称来创建

  1. var o = new Object();

Object 类型是所有它的实例的基础,所以, Object 类型所具有的任何属性和方法也同样存在于更具体的对象中。

  1. constructor
    保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor) 就是 Object()。
  2. hasOwnProperty(propertyName)
    用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定(例如:o.hasOwnProperty("name"))。
  3. isPrototypeOf(object)
    用于检查传入的对象是否是传入对象的原型(第 5 章将讨论原型)
  4. propertyIsEnumerable(propertyName)
    用于检查给定的属性是否能够使用 for-in 语句 (本章后面将会讨论)来枚举。与 hasOwnProperty() 方法一样,作为参数的属性名必须以字符串形式指定
  5. (???)toLocaleString()
    返回对象的字符串表示,该字符串与执行环境的地区对应
  6. toString()
    返回对象的字符串表示
  7. valueOf()
    返回对象的字符串、数值或布尔值表示。通常与 toString() 方法的返回值相同

从技术角度讲,ECMA-262中对象的行为不一定适用于 JavaScript中的其他对象。 浏览器环境中的对象,比如 BOM 和 DOM 中的对象,都属于宿主对象,因为它们是由宿主实现提供和定义的。ECMA-262不负责定义宿主对象,因此宿主对象可能会也 可能不会继承 Object。


一元操作符

只能操作一个值的操作符叫做一元操作符


  1. var s1 = "2";
  2. var s2 = "z";
  3. var b = false;
  4. var f = 1.1;
  5. var o = {
  6. valueOf: function() {
  7. return -1;
  8. }
  9. };
  10. s1++; // 值变成数值 3
  11. s2++; // 值变成 NaN
  12. b++; // 值变成数值 1
  13. f--; // 值变成 0.10000000000000009(由于浮点舍入错误所致)
  14. o--; // 值变成数值-2
  • 位操作符

    1. ES 中用 64 位格式存储数值,但操作的时候会把 64 位转换为 32 位,操作后的结果再转回 64 位

      • 正数用 32 位原码
      • 负数用 32 位 补码(原码 --> 反码 --> 补码)
    2. 当我们以二进制字符串形式输出一个负数时,我们看到的只是这个负数绝对值的二进制码前面加上了一个负号

    1. var num = -18;
    2. alert(num.toString(2)); // "-10010"

    • 在对特殊的 NaN 和 Infinity 值应用位操作时,这两个值都会被当成 0来处理
    • 如果对非数值应用位操作符,会先使用 Number()函数将该值转换为一个数值(自动完成),然后 再应用位操作。得到的结果将是一个数值
    1. var num1 = 25; // 二进制 00000000000000000000000000011001
    2. var num2 = ~num1; // 二进制 11111111111111111111111111100110
    3. alert(num2); // -26

    语句


    函数

    • 不用声明参数类型
    • 不同指定返回值类型
    • 严格模式对函数有一些限制
      • 不能把函数命名为 eval 或 arguments;
      • 不能把参数命名为 eval 或 arguments;
      • 不能出现两个命名参数同名的情况。
    添加新批注
    在作者公开此批注前,只有你和作者可见。
    回复批注