一、script标签
-
async
属性(只是适用于外部脚本文件)立即下载脚本,但不妨碍页面其他操作 -
defer
属性(只是适用于外部脚本文件)对脚本执行进行延迟,直到页面加载为止
二、noscript标签
- 浏览器不支持脚本
- 浏览器不支持脚本,但是脚本被禁用
三、严格模式
- 使用
"use strict"
开启严格模式;针对单个函数,将"use strict"
.0放在函数体的第一行 - 在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,全局变量必须显式声明。
"use strict";
v = 1; // 报错,v未声明
for(i = 0; i < 2; i++) { // 报错,i未声明
}
- 静态绑定
(1)禁止使用with语句
(2)创设eval作用域,正常模式下,Javascript语言有两种变量作用域(scope):全局作用域和函数作用域。严格模式创设了第三种作用域:eval作用域。
"use strict";
var x = 2;
console.info(eval("var x = 5; x")); // 5
console.info(x); // 2
- 增强的安全措施
- 禁止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();
- 禁止删除变量
严格模式下无法删除变量。只有configurable设置为true的对象属性,才能被删除。
"use strict";
var x;
delete x; // 语法错误
var o = Object.create(null, {'x': {
value: 1,
configurable: true
}});
delete o.x; // 删除成功
- 显式报错
(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)对象不能有重名的属性
正常模式下,如果对象有多个重名属性,最后赋值的那个属性会覆盖前面的值。严格模式下,这属于语法错误。
"use strict";
var o = {
p: 1,
p: 2
}; // 语法错误
(2)函数不能有重名的参数
正常模式下,如果函数有多个重名的参数,可以用arguments[i]读取。严格模式下,这属于语法错误。
"use strict";
function f(a, a, b) { // 语法错误
return ;
}
- 禁止八进制表示法
正常模式下,整数的第一位如果是0,表示这是八进制数,比如0100等于十进制的64。严格模式禁止这种表示法,整数第一位为0,将报错。
"use strict";
var n = 0100; // 语法错误
- 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(); // 报错
- 函数必须声明在顶层
将来Javascript的新版本会引入"块级作用域"。为了与新版本接轨,严格模式只允许在全局作用域或函数作用域的顶层声明函数。也就是说,不允许在非函数的代码块内声明函数。
"use strict";
if (true) {
function f() { } // 语法错误
}
for (var i = 0; i < 5; i++) {
function f2() { } // 语法错误
}
- 保留字
为了向将来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
保留字,也是不能作为变量名的。
四、数据类型
- 简单数据类型
Undefined
null
Boolean
Number
String
- 复杂数据类型
-
Object
(本质是一组无序的名值对)
- typeof
'undefined'//对应这个值未定义
'boolean'//对应这个值是布尔值
'string'//对应这个值是字符串
'number'//对应这个值是数值
'object'//对应这个值是对象或者null
'functon'//对应这个值是函数
- Boolean
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
String | 非空字符串 | 空字付串 |
Number | 非零值 | 0和NaN |
Object | 任何对象 | null |
Underfined | underfined |
- Number
(1)浮点数最高精度 17位小数。
(2)数值范围(5e-324,1.7976931348623157e+308)
,超出范围位Infinity
,可以用isFinite()
判断是不是超出范围。
(3)NaN
:isNaN()
函数会尝试把参数转换为数值类型。
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()
方法,然后再次依照前面的规则转换返回的字符串值。
- String
1).字符串一旦创建不可改变
2).转换为字符串:第一种使用toSting()
方法,如果是null
或者undefined
就输出字面量 - Object
每个实例都有的属性和方法
constructor()//保存着用于创建当前对象的函数
hasOwnProperty()//用于检查给定的属性在当前实例中(不是实例的原型)是否包含存在
isPrototypeOf()//用于检查传入的对象是不是当前对象的原型
propertyIsEnumerable()//用于检查给定的属性是否可以for-in来枚举
toLocaleString()//返回对象的字符串表示
toString()//返回对象的字符串表示
valueOf()//返回对象的字符串,数值或者布尔表示