美文网首页
JavaScript高程读书笔记(1)

JavaScript高程读书笔记(1)

作者: 小懒豆 | 来源:发表于2018-03-18 17:05 被阅读6次

一、script标签

  1. async属性(只是适用于外部脚本文件)立即下载脚本,但不妨碍页面其他操作
  2. defer属性(只是适用于外部脚本文件)对脚本执行进行延迟,直到页面加载为止

二、noscript标签

  1. 浏览器不支持脚本
  2. 浏览器不支持脚本,但是脚本被禁用

三、严格模式

  1. 使用"use strict"开启严格模式;针对单个函数,将"use strict".0放在函数体的第一行
  2. 在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,全局变量必须显式声明。
"use strict";
v = 1; // 报错,v未声明
for(i = 0; i < 2; i++) { // 报错,i未声明
}
  1. 静态绑定
    (1)禁止使用with语句
    (2)创设eval作用域,正常模式下,Javascript语言有两种变量作用域(scope):全局作用域和函数作用域。严格模式创设了第三种作用域:eval作用域。
"use strict";
var x = 2;
console.info(eval("var x = 5; x")); // 5
console.info(x); // 2
  1. 增强的安全措施
  • 禁止this关键字指向全局对象
function f(){
  return !this;
} 
// 返回false,因为"this"指向全局对象,"!this"就是false
function f(){ 
  "use strict";
  return !this;
} 
// 返回true,因为严格模式下,this的值为undefined,所以"!this"为true。
  • 禁止在函数内部遍历调用栈
function f1(){

 "use strict";

 f1.caller; // 报错

 f1.arguments; // 报错
}

f1();
  1. 禁止删除变量
    严格模式下无法删除变量。只有configurable设置为true的对象属性,才能被删除。
"use strict";
var x;
delete x; // 语法错误
var o = Object.create(null, {'x': {
  value: 1,
  configurable: true
}});

  delete o.x; // 删除成功
  1. 显式报错
    (1)正常模式下,对一个对象的只读属性进行赋值,不会报错,只会默默地失败。严格模式下,将报错。
"use strict";
var o = {};
Object.defineProperty(o, "v", { value: 1, writable: false });
o.v = 2; // 报错

(2)严格模式下,对一个使用getter方法读取的属性进行赋值,会报错。

"use strict";
var o = {
 get v() { return 1; }
};
o.v = 2; // 报错

(3) 严格模式下,对禁止扩展的对象添加新属性,会报错

"use strict";

var o = {};

Object.preventExtensions(o);

o.v = 1; // 报错

(4)严格模式下,删除一个不可删除的属性,会报错

 "use strict";

 delete Object.prototype; // 报错
  1. 重名错误
    严格模式新增了一些语法错误。
    (1)对象不能有重名的属性
    正常模式下,如果对象有多个重名属性,最后赋值的那个属性会覆盖前面的值。严格模式下,这属于语法错误。
  "use strict";

  var o = {
    p: 1,
    p: 2
  }; // 语法错误

(2)函数不能有重名的参数

正常模式下,如果函数有多个重名的参数,可以用arguments[i]读取。严格模式下,这属于语法错误。

  "use strict";

  function f(a, a, b) { // 语法错误

    return ;

  }
  1. 禁止八进制表示法

正常模式下,整数的第一位如果是0,表示这是八进制数,比如0100等于十进制的64。严格模式禁止这种表示法,整数第一位为0,将报错。

  "use strict";

  var n = 0100; // 语法错误
  1. arguments对象的限制

arguments是函数的参数对象,严格模式对它的使用做了限制。

(1) 不允许对arguments赋值

  "use strict";

  arguments++; // 语法错误

  var obj = { set p(arguments) { } }; // 语法错误

  try { } catch (arguments) { } // 语法错误

  function arguments() { } // 语法错误

  var f = new Function("arguments", "'use strict'; return 17;"); // 语法错误

(2) arguments不再追踪参数的变化

  function f(a) {
    a = 2;
    return [a, arguments[0]];
  }
  f(1); // 正常模式为[2,2]
  function f(a) {
    "use strict";
    a = 2;
    return [a, arguments[0]];
 }
  f(1); // 严格模式为[2,1]

(3) 禁止使用arguments.callee

这意味着,你无法在匿名函数内部调用自身了。

  "use strict";

  var f = function() { return arguments.callee; };

  f(); // 报错
  1. 函数必须声明在顶层

将来Javascript的新版本会引入"块级作用域"。为了与新版本接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码块内声明函数。

  "use strict";

  if (true) {

    function f() { } // 语法错误

  }

  for (var i = 0; i < 5; i++) {

    function f2() { } // 语法错误

  }
  1. 保留字

为了向将来Javascript的新版本过渡,严格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield

使用这些词作为变量名将会报错。

  function package(protected) { // 语法错误

    "use strict";

    var implements; // 语法错误

  }

此外,ECMAscript第五版本身还规定了另一些保留字class, enum, export, extends, import, super,以及各大浏览器自行增加的const保留字,也是不能作为变量名的。

四、数据类型

  1. 简单数据类型
  • Undefined
  • null
  • Boolean
  • Number
  • String
  1. 复杂数据类型
  • Object(本质是一组无序的名值对)
  1. typeof

'undefined'//对应这个值未定义
'boolean'//对应这个值是布尔值
'string'//对应这个值是字符串
'number'//对应这个值是数值
'object'//对应这个值是对象或者null
'functon'//对应这个值是函数

  1. Boolean
数据类型 转换为true的值 转换为false的值
String 非空字符串 空字付串
Number 非零值 0和NaN
Object 任何对象 null
Underfined underfined
  1. Number
    (1)浮点数最高精度 17位小数。
    (2)数值范围(5e-324,1.7976931348623157e+308),超出范围位Infinity,可以用isFinite()判断是不是超出范围。
    (3)NaNisNaN()函数会尝试把参数转换为数值类型。
  1/0   //Infinity
  -1/0  //-Infinity
  0/0   //NaN

(4)数值转换

  • parseInt():第二个参数可以指定进制
    parseInt()函 数在转换字符串时,更多的是看其是否符合数值模式。它会忽略字符串前面的空格,直至找到第一个非空格字符。
    如果第一个字符不是数字字符或者负 号,parseInt()就会返回NaN;也就是说,用parseInt()转换空字符串会返回NaN(Number()对空字符串返回0)。
    如果第一个 字符是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。
    例如,“123blue”会被转换为 1234,因为“blue”会被完全忽略。类似地,“22.5”会被转换成22,因为小数点并不是有效的数字字符。
    如果字符串中的第一个字符是数字字符,parseInt()也能够识别出各种整数格式(即十进制、八进制、十六进制)。
    也就是说,如果字符串以 “0x”开头且后跟数字字符,就会将其当作一个十六进制整数;如果字符串以“0”开头且后跟数字字符,则将其当作一个八进制数来解析。
  • parseFloa()
    parseInt()类似,只是一个小数点有效,第二个以后的忽略。只解析十进制,十六进制转换为0
  • Number()
    1)如果是Boolean值,true和false将分别转换为1和0。
    2)如果是数字值,只是简单的传入和返回。
    3)如果是null值,返回0。
    4)如果是undefined,返回NaN。
    5)如果是字符串,遵循下列规则:
  • 如果是字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即“1”变成1,“123”会变成123,而“011”会变成11(前导的零被忽略了);
  • 如果字符串中包含有效的浮点格式,如“1.1”,则将其转换为对应的浮点数值(同样也会忽略前导零);
  • 如果字符串中包含有效的十六进制格式,例如"0xf",则将其他转换为相同大小的十进制整数值;`
  • 如果字符串是空的(不包含任何字符),则将其转换为0;
  • 如果字符串中包含除上述格式之外的字符,则将其他转换成NaN.
    6)如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用的对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。
  1. String
    1).字符串一旦创建不可改变
    2).转换为字符串:第一种使用toSting()方法,如果是null或者undefined就输出字面量
  2. Object
    每个实例都有的属性和方法
constructor()//保存着用于创建当前对象的函数
hasOwnProperty()//用于检查给定的属性在当前实例中(不是实例的原型)是否包含存在
isPrototypeOf()//用于检查传入的对象是不是当前对象的原型
propertyIsEnumerable()//用于检查给定的属性是否可以for-in来枚举
toLocaleString()//返回对象的字符串表示
toString()//返回对象的字符串表示
valueOf()//返回对象的字符串,数值或者布尔表示

相关文章

  • JavaScript高程读书笔记(目录)

    JavaScript高程读书笔记(1) 一、script标签 二、noscript标签 三、严格模式 四、数据类型...

  • JavaScript高程读书笔记(1)

    一、script标签 async属性(只是适用于外部脚本文件)立即下载脚本,但不妨碍页面其他操作 defer属性(...

  • JavaScript高程读书笔记(2)

    五、操作符 算数操作符、位操作符、关系操作符、 相等操作符 一元操作符++和--:注意a+++,- 位操作符按位非...

  • JavaScript高程读书笔记(3)

    八、垃圾回收 标记清除 当变量进入环境时,例如,在函数中声明一个变量,就将这个变量标记为“进入环境”。从逻辑上讲,...

  • JS高程(一)

    复习 JavaScript 高程, 基本上 是 摘抄原文。 在 HTML 中 使用 JavaScript JS 包...

  • JavaScript高程复习(1) -- 基础语法

    第三章 基本概念 3.1 语法 ECMAScript标识符一般采用驼峰大小写格式,也就是第一个字母小写,剩下的每个...

  • 06-1 | 读JavaScript 高程

    接上篇 知识点:1.构造函数原型实例三者是怎样的一个关系?2.如何确定一个属性是在对象本身还是在原型身上?3.原型...

  • 07-1 | 读JavaScript 高程

    这是第七章函数表达式,这一章涉及函数预编译,闭包,作用域链内容。函数涉及内容繁多。今天来看作用域链。 在 06-2...

  • 02-1 | 读JavaScript 高程 | 解释

    上篇说了对于 JavaScript,预处理 + 执行 = 解释,解释没那么简单,那么究竟什么是解释? 解释解释 你...

  • JavaScript高程读书笔记-面向对象设计

    一、理解对象 1、什么是对象面向对象(Object-Oriented,OO),ECMA中对象定义是:无序属性的集合...

网友评论

      本文标题:JavaScript高程读书笔记(1)

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