资讯专栏INFORMATION COLUMN

《Javascript高级程序设计 (第三版)》第三章 基本概念

caige / 1152人阅读

摘要:如在上列中结果实际上是给定数字的字符串形式无效语法有效语法在上列中结果是因为第一个被视为的一部分,第二个是属性访问运算符。用于检查传入的对象是否是传入对象的原型第章将讨论原型。返回对象的字符串表示。

</>复制代码

  1. 只挑本人重要的写(有夹杂其他补充)

3.1 语法 注释

</>复制代码

  1. 单行注释以两个斜杠开头,如下所示:
  2. // 单行注释
  3. 块级注释以一个斜杠和一个星号( /* )开头,
  4. 以一个星号和一个斜杠( */ )结尾,如下所示:
  5. /*
  6. * 这是一个多行
  7. * (块级)注释
  8. */

严格模式(一些不确定的行为将得到处理,而且对某些不安全的操作也会抛出错误)

</>复制代码

  1. 要在整个脚本中启用严格模式可以在顶部添加如下代码:
  2. "use strict";
  3. 在函数内部的上方包含这条编译指示,也可以指定函在严格模式下执行:
  4. function doSomething(){
  5. "use strict";
  6. //函数体
  7. }

语句
ECMAScript 中的语句以一个分号结尾;如果省略分号,则由解析器确定语句的结尾

3.2 变量

</>复制代码

  1. 描述: ECMAScript 的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。
    简单来说,每个变量仅仅是一个用于保存值的占位符而已。

注意
用 var 操作符定义的变量将成为定义该变量的作用域中的局部变量。简单来说,如果在函数中使用 var 定义一个变量,那么这个变量在函数退出后就会被销毁

</>复制代码

  1. function test(){
  2. var message = "hi"; // 局部变量
  3. }
  4. test();
  5. alert(message); // 错误
3.3 数据类型 typeof操作符

可能会返回以下结果字符串:

</>复制代码

  1. "undefined"——如果这个值未定义;
  2. "boolean"——如果这个值是布尔值;
  3. "string"——如果这个值是字符串;
  4. "number"——如果这个值是数值;
  5. "object"——如果这个值是对象或null
  6. "function"——如果这个值是函数。
  7. 注意:
  8. a.对null返回是"object"
  9. typeof null // object;
  10. b.不能区分对象、数组、正则,对它们操作都返回"object"
  11. typeof Number()// object;
  12. c.对NaN返回是"number"
  13. typeof parseInt("你") === "number" //true
Undefined类型

</>复制代码

  1. 描述:声明变量但未对其加以初始化时,这个变量的值就是 undefined

</>复制代码

  1. 下面几种情况会出现undefined
  2. 访问数组或对象不存在的成员
  3. 定义的变量未赋值。
  4. 函数没有返回值,或return后没有数据。
  5. 注意:
  6. var a; // undefined
  7. b // ReferenceErroe:b is not defined;
  8. typeof a; // undefined;
  9. typeof b; // undefined;
Null类型

</>复制代码

  1. 描述: 表示一个空对象指针; var car = null; alert(typeof car); //
    "object" 如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为 null 而不是其他值。

</>复制代码

  1. 注意:
  2. console.log(null == undefined) // true;
  3. console.log(null === undefined) //false
  4. 判断值是否为null
  5. var a = null;
  6. (!a && typeof a === "object");// true;
Boolean类型

可转转化布尔类型:

</>复制代码

  1. a.假值
  2. undefinednullfalse、+0-0NaN"";
  3. b、假值对象
  4. var a = new Boolean(false);
  5. var b = new Number(0);
  6. var c = new String("");
  7. var d = Boolean(a && b && c );
  8. d // true;
  9. var e = a && b && c;
  10. e // String {length: 0[[PrimitiveValue]]: ""};
Number类型

</>复制代码

  1. 描述: 表示整数和浮点数值(双精度64位二进制); 整数就是没有小数的十进制数。所以42.0即等于“整数”42。

数字语法

a.十进制:

</>复制代码

  1. var a = 42;
  2. var b = 42.3;

b.前面的0可以省略:

</>复制代码

  1. var a = 0.42;
  2. var b = .42;

c.小数点部分最后的0也可以省略

</>复制代码

  1. var a = 42.0;
  2. var b = 42.;

d.默认情况下大部分数字都以十进制显示,小数部分最后的0被省略

</>复制代码

  1. var a = 42.3000 // 42.3
  2. var b = 42.0 // 42

e.特别大与特别小的数字默认用指数显示

</>复制代码

  1. var a = 5E10;
  2. a; // 50000000000
  3. a.toExponential(); // "5e+10"
  4. var b = a * a;
  5. b; // 2.5e+21
  6. var c = 1/a;
  7. c; // 2e-11

f.由于数字可以使用Number对象进行封装,可以调用Number.prototype方法。如:

</>复制代码

  1. var a = 42.59;
  2. a.toFixed(0); // "43"
  3. a.toFixed(1); // "42.6";
  4. a.toFixed(3); // "42.590"
  5. 在上列中结果实际上是给定数字的字符串形式
  6. // 无效语法
  7. 42.toFixed(3); // SyntaxError
  8. //有效语法
  9. (42).toFixed(3);
  10. 0.42.toFixed(3);
  11. 42..toFixed(3);
  12. 在上列中结果是因为第一个.被视为number的一部分,第二个.是属性访问运算符。

较小的数值:(这是二进制浮点数最大的问题)

</>复制代码

  1. 0.1 + 0.2 === 0.3; // false

</>复制代码

  1. 解决方法(判断两数是否相等):
  2. function numbersCloseEnoughToEqual(n1,n2) {
  3. return Math.abs(n1 - n2 ) < Math.pow(2,-52);
  4. }

整数的安全范围:

</>复制代码

  1. Number.MAX_SAFE_INTEGER = 2^53 -1;
  2. Number.MIN_SAFE_INTEGER = -(2^53 -1);
  3. 如数据库中的64位ID等,由于JavaScript的数值类型无法精确呈现64位数值,所以必须将它保存为字符串。

整数检测:

</>复制代码

  1. Number.isInteger = function(num) {
  2. return typeof num === "number" && num % 1 === 0;
  3. }

- 检测是否是安全整数:

</>复制代码

  1. Number.isSafeInteger = function(num) {
  2. return Number.isInteger(num) && Math.abs(num) <= Number.MAX_SAFE_INTEGER;
  3. }

特殊的数字:

</>复制代码

  1. 描述:数学运算的操作数不是数字类型,无法返回一个有效的数字,会返回NaN

a.不是数字的数字

</>复制代码

  1. var a = 2/"foo"; // NaN
  2. typeof a === "number"; // true
  3. 不是数字的数字是数字类型。
  4. 注意:
  5. NaN是一个特殊值,他和自身不相等;
  6. NaN != NaN; // true
  7. 可用isNaN()来判断(但有个bug):
  8. var a = 2 / "foo"
  9. isNaN(a); // true
  10. var b = "foo";
  11. isNaN(b); // true
  12. isNaN()检查参数是否不是NaN,也不是数字。
  13. 解决:
  14. Number.isNaN = function(n){
  15. return (typeof n === "number" && window.isNaN(n))
  16. }

b.无穷数

</>复制代码

  1. var a = 1 /0; // Infinity
  2. var b = -1/0; // -Infinity
  3. Infinity/Infinity; // NaN
  4. 1/Infinity; // 0
  5. -1/Infinity; // -0

c.零值

</>复制代码

  1. var a = 0/ -3; //-0
  2. var b = 0 * -3; // -0
  3. a.toString(); // "0"
  4. a + ""; // "0"
  5. String(a); // "0"
  6. JSON.stringfy(a); // "0"
  7. +"-0"; // -0
  8. Number("-0"); // -0
  9. JSON.parse("-0"); // -0
  10. -0 == 0; // true
  11. -0 === 0; // true
  12. 0 > -0; // false
  13. 区分 -0 和 0:
  14. function isNegZero(n) {
  15. var n = Number(n);
  16. return (n === 0) && (1/n === -Infinity);
  17. }
String类型

</>复制代码

  1. 特点: 字符串是不可变的,也就是说,字符串一旦建, 它们的值就不能改变。
    要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量

转换字符串:

</>复制代码

  1. 基本类型值的转化规则为:
  2. null转化为"null"
  3. undefined转化为"undefined"
  4. true转化为"true",
  5. 数字的字符串化则遵循通用规则,
  6. 数组的默认toString(),将所有单元字符串化后再用","链接起来。

JSON字符串化

</>复制代码

  1. 注意:
  2. a.JSON字符串化并非严格意义上的强制类型转换。
  3. 序列化的结果总是字符串
  4. JSON.stringify("42"); // ""42""
  5. JSON.stringify()在对象遇到undefinedfunctionsymbol 时会自动将其忽略,在数组中返回null(以保证单元位置不变)
  6. JSON.stringify(undefined);// undefined
  7. JSON.stringify([1,undefined,function(){},4]); // "[1,null,null,4]"
  8. JSON.stringify({a:2,b:function(){}}) // "{"a":2}"
  9. b.如果传递给JSON.stringify()的对象定义了toJSON()方法,该方法会在字符串前调用,以便将对象转换为安全的JSON值。
Object类型

Object 的每个实例都具有下列属性和方法:

</>复制代码

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/89519.html

相关文章

  • 004-读书笔记-JavaScript高级程序设计 基本概念(下)

    摘要:操作符,会将数值改变正数变成负数负数变成正数。同时,也说明了,使用两个逻辑非操作符和的操作结果相同。操作符得到的是余数。不相等操作符有两种。 这篇笔记的内容对应的是《JavaScript高级程序设计(第三版)》中的第三章。 1.操作符 1-1 一元操作符 递增和递减操作符 递增和递减操作符有两个 ++ 和 --。一元操作符使用的时候,可以前置也可以后置。由于两个操作方式类似,先只说明 ...

    nevermind 评论0 收藏0
  • 如果想成为一名顶尖的前端,这份书单你一定要收藏!

    摘要:其中负载均衡那一节,基本上是参考的权威指南负载均衡的内容。开发指南读了一半,就是看这本书理解了的事件循环。哈哈创京东一本骗钱的书。 欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯IVWEB团队 发表于云+社区专栏作者:link 2014年一月以来,自己接触web前端开发已经两年多了,记录一下自己前端学习路上看过的,以及道听途说的一些书,基本上按照由浅入深来介绍...

    callmewhy 评论0 收藏0
  • 如果想成为一名顶尖的前端,这份书单你一定要收藏!

    摘要:其中负载均衡那一节,基本上是参考的权威指南负载均衡的内容。开发指南读了一半,就是看这本书理解了的事件循环。哈哈创京东一本骗钱的书。 欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯IVWEB团队 发表于云+社区专栏作者:link 2014年一月以来,自己接触web前端开发已经两年多了,记录一下自己前端学习路上看过的,以及道听途说的一些书,基本上按照由浅入深来介绍...

    Scliang 评论0 收藏0
  • 如果想成为一名顶尖的前端,这份书单你一定要收藏!

    摘要:其中负载均衡那一节,基本上是参考的权威指南负载均衡的内容。开发指南读了一半,就是看这本书理解了的事件循环。哈哈创京东一本骗钱的书。欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯IVWEB团队发表于云+社区专栏 作者:link 2014年一月以来,自己接触web前端开发已经两年多了,记录一下自己前端学习路上看过的,以及道听途说的一些书,基本上按照由浅入深来介绍。...

    233jl 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<