javascript在严格模式下的执行结果
2018-03-14 07:50
232 查看
给未经声明的变量赋值在严格模式
下会导致抛出 ReferenceError 错误。
第 5 版把在非严格模式下运行时的保留字缩减为下列这些:
class enum extends super
const export import
ECMAScript 5 引入了严格模式(strict mode)的概念。严格模式是为 JavaScript 定义了一种不同的
解析与执行模型。在严格模式下,ECMAScript 3 中的一些不确定的行为将得到处理,而且对某些不安全
的操作也会抛出错误
var octalNum1 = 070; // 八进制的 56
var octalNum2 = 079; // 无效的八进制数值——解析为 79
var octalNum3 = 08; // 无效的八进制数值——解析为 8
八进制字面量在严格模式下是无效的,会导致支持的 JavaScript 引擎抛出错误。
即在 ECMAScript 中,
对象可以通过执行 new 操作符后跟要创建
的对象类型的名称来创建。而创建 Object 类型的实例并为其添加属性和(或)方法,就可以创建自定
义对象,如下所示:
var o = new Object();
这个语法与 Java 中创建对象的语法相似;但在 ECMAScript 中,如果不给构造函数传递参数,则可
以省略后面的那一对圆括号
(就像 Java 中的 java.lang.Object 对象一样)Object 类型是所有它的实例的基础。换句话说,
Object 类型所具有的任何属性和方法也同样存在于更具体的对象中。
object在进行运算时 先调用valueOf方法
在使用关系操作符比较两个字符串时,会执行一种奇怪的操作。很多人都会认为,在比较字符串值
时,小于的意思是“在字母表中的位置靠前”,而大于则意味着“在字母表中的位置靠后”,但实际上完
全不是那么回事。在比较字符串时,实际比较的是两个字符串中对应位置的每个字符的字符编码值。
严格模式下不允许使用 with 语句,否则将视为语法错误。
严格模式对函数有一些限制:
不能把函数命名为 eval 或 arguments ;
不能把参数命名为 eval 或 arguments ;
不能出现两个命名参数同名的情况。
这是因为 arguments 对象的长度是由传入的参数个数决定的,不是由定义函数时的命名
参数的个数决定的。严格模式对如何使用 arguments 对象做出了一些限制。首先,像前面例子中那样的赋值会变得无
效。也就是说,即使把 arguments[1] 设置为 10 , num2 的值仍然还是 undefined 。其次,重写
arguments 的值会导致语法错误(代码将不会执行)。
变量对象
我们并不是想知道某个值是对象,而是想知道它是什么类型的对象。为此,ECMAScript
提供了 instanceof 操作符,其语法如下所示:
result = variable instanceo
4000
f constructor
如果变量是给定引用类型(根据它的原型链来识别;第 6 章将介绍原型链)的实例,那么
instanceof 操作符就会返回 true 。请看下面的例子:
alert(person instanceof Object); // 变量 person 是 Object 吗?
alert(colors instanceof Array); // 变量 colors 是 Array 吗?
alert(pattern instanceof RegExp); // 变量 pattern 是 RegExp 吗?
根据规定,所有引用类型的值都是 Object 的实例。因此,在检测一个引用类型值和 Object 构造
函数时, instanceof 操作符始终会返回 true 。当然,如果使用 instanceof 操作符检测基本类型的
值,则该操作符始终会返回 false ,因为基本类型不是对象。
做法叫做解除引用(dereferencing)。这一做法适用于大多数全局变量和全局对象的属性。局部变量会在
它们离开执行环境时自动被解除引用,如下面这个例子所示:
function createPerson(name){
var localPerson = new Object();
localPerson.name = name;
return localPerson;
}
var globalPerson = createPerson("Nicholas");
// 手工解除 globalPerson 的引用
globalPerson = null;
在这个例子中,变量 globalPerson 取得了 createPerson() 函数返回的值。在 createPerson()
函数内部,我们创建了一个对象并将其赋给局部变量 localPerson ,然后又为该对象添加了一个名为
name 的属性。最后,当调用这个函数时, localPerson 以函数值的形式返回并赋给全局变量
globalPerson 。由于 localPerson 在 createPerson() 函数执行完毕后就离开了其执行环境,因此
无需我们显式地去为它解除引用。但是对于全局变量 globalPerson 而言,则需要我们在不使用它的
时候手工为它解除引用,这也正是上面例子中最后一行代码的目的。
不过,解除一个值的引用并不意味着自动回收该值所占用的内存。解除引用的真正作用是让值脱离
执行环境,以便垃圾收集器下次运行时将其回收。
push(),pop(),shift(),unshift(),reverse(),sort()会改变原数组,
join()不改变原数组,join() 方法只接收一个参数,即用作分隔符的字符串,然后返回包含所有数组项的字符串
concat()不改变原数组,不改变原字符串
slice() substr() substring()不改变原字符串和原数组
splice()会改变原数组
复制数组和字符串的方法:
var arr=[1,2,3,4];
var arr3=arr;
var arr1=arr.concat();
var arr2=arr.slice(0);
var str="iamtest";
var str1=str;
var str2=str.concat();
var str3=str.slice(0);
var str4=str.sbstr(0);
var str5=str.substring(0)
str.substring(2,5)==str.slice(2,5)
str.substring(-3,-1)//"" 负数转换为0
str.slice(-3,-1)//"es" str.length-3 str.length-1
var stringValue = "hello world";
alert(stringValue.slice(-3)); //"rld"
alert(stringValue.substring(-3)); //"hello world"
alert(stringValue.substr(-3)); //"rld"
alert(stringValue.slice(3, -4)); //"lo w"
alert(stringValue.substring(3, -4)); //"hel"
alert(stringValue.substr(3, -4)); //"" (空字符串)
var person = {};
Object.defineProperty(person, "name", {
writable: false,
value: "Nicholas"
});
alert(person.name); //"Nicholas"
person.name = "Greg";
alert(person.name); //"Nicholas"
DataPropertiesExample01.htm
这个例子创建了一个名为 name 的属性,它的值"Nicholas"是只读的。这个属性的值是不可修改
的,如果尝试为它指定新值,则在非严格模式下,赋值操作将被忽略;在严格模式下,赋值操作将会导
致抛出错误。
下会导致抛出 ReferenceError 错误。
第 5 版把在非严格模式下运行时的保留字缩减为下列这些:
class enum extends super
const export import
ECMAScript 5 引入了严格模式(strict mode)的概念。严格模式是为 JavaScript 定义了一种不同的
解析与执行模型。在严格模式下,ECMAScript 3 中的一些不确定的行为将得到处理,而且对某些不安全
的操作也会抛出错误
var octalNum1 = 070; // 八进制的 56
var octalNum2 = 079; // 无效的八进制数值——解析为 79
var octalNum3 = 08; // 无效的八进制数值——解析为 8
八进制字面量在严格模式下是无效的,会导致支持的 JavaScript 引擎抛出错误。
即在 ECMAScript 中,
对象可以通过执行 new 操作符后跟要创建
的对象类型的名称来创建。而创建 Object 类型的实例并为其添加属性和(或)方法,就可以创建自定
义对象,如下所示:
var o = new Object();
这个语法与 Java 中创建对象的语法相似;但在 ECMAScript 中,如果不给构造函数传递参数,则可
以省略后面的那一对圆括号
(就像 Java 中的 java.lang.Object 对象一样)Object 类型是所有它的实例的基础。换句话说,
Object 类型所具有的任何属性和方法也同样存在于更具体的对象中。
object在进行运算时 先调用valueOf方法
在使用关系操作符比较两个字符串时,会执行一种奇怪的操作。很多人都会认为,在比较字符串值
时,小于的意思是“在字母表中的位置靠前”,而大于则意味着“在字母表中的位置靠后”,但实际上完
全不是那么回事。在比较字符串时,实际比较的是两个字符串中对应位置的每个字符的字符编码值。
严格模式下不允许使用 with 语句,否则将视为语法错误。
严格模式对函数有一些限制:
不能把函数命名为 eval 或 arguments ;
不能把参数命名为 eval 或 arguments ;
不能出现两个命名参数同名的情况。
这是因为 arguments 对象的长度是由传入的参数个数决定的,不是由定义函数时的命名
参数的个数决定的。严格模式对如何使用 arguments 对象做出了一些限制。首先,像前面例子中那样的赋值会变得无
效。也就是说,即使把 arguments[1] 设置为 10 , num2 的值仍然还是 undefined 。其次,重写
arguments 的值会导致语法错误(代码将不会执行)。
变量对象
我们并不是想知道某个值是对象,而是想知道它是什么类型的对象。为此,ECMAScript
提供了 instanceof 操作符,其语法如下所示:
result = variable instanceo
4000
f constructor
如果变量是给定引用类型(根据它的原型链来识别;第 6 章将介绍原型链)的实例,那么
instanceof 操作符就会返回 true 。请看下面的例子:
alert(person instanceof Object); // 变量 person 是 Object 吗?
alert(colors instanceof Array); // 变量 colors 是 Array 吗?
alert(pattern instanceof RegExp); // 变量 pattern 是 RegExp 吗?
根据规定,所有引用类型的值都是 Object 的实例。因此,在检测一个引用类型值和 Object 构造
函数时, instanceof 操作符始终会返回 true 。当然,如果使用 instanceof 操作符检测基本类型的
值,则该操作符始终会返回 false ,因为基本类型不是对象。
优化内存占用的最佳方式,就是为执行
中的代码只保存必要的数据。一旦数据不再有用,最好通过将其值设置为 null 来释放其引用——这个做法叫做解除引用(dereferencing)。这一做法适用于大多数全局变量和全局对象的属性。局部变量会在
它们离开执行环境时自动被解除引用,如下面这个例子所示:
function createPerson(name){
var localPerson = new Object();
localPerson.name = name;
return localPerson;
}
var globalPerson = createPerson("Nicholas");
// 手工解除 globalPerson 的引用
globalPerson = null;
在这个例子中,变量 globalPerson 取得了 createPerson() 函数返回的值。在 createPerson()
函数内部,我们创建了一个对象并将其赋给局部变量 localPerson ,然后又为该对象添加了一个名为
name 的属性。最后,当调用这个函数时, localPerson 以函数值的形式返回并赋给全局变量
globalPerson 。由于 localPerson 在 createPerson() 函数执行完毕后就离开了其执行环境,因此
无需我们显式地去为它解除引用。但是对于全局变量 globalPerson 而言,则需要我们在不使用它的
时候手工为它解除引用,这也正是上面例子中最后一行代码的目的。
不过,解除一个值的引用并不意味着自动回收该值所占用的内存。解除引用的真正作用是让值脱离
执行环境,以便垃圾收集器下次运行时将其回收。
push(),pop(),shift(),unshift(),reverse(),sort()会改变原数组,
join()不改变原数组,join() 方法只接收一个参数,即用作分隔符的字符串,然后返回包含所有数组项的字符串
concat()不改变原数组,不改变原字符串
slice() substr() substring()不改变原字符串和原数组
splice()会改变原数组
字符串和数组的共有方法
slice() concat()复制数组和字符串的方法:
var arr=[1,2,3,4];
var arr3=arr;
var arr1=arr.concat();
var arr2=arr.slice(0);
var str="iamtest";
var str1=str;
var str2=str.concat();
var str3=str.slice(0);
var str4=str.sbstr(0);
var str5=str.substring(0)
str.substring(2,5)==str.slice(2,5)
str.substring(-3,-1)//"" 负数转换为0
str.slice(-3,-1)//"es" str.length-3 str.length-1
var stringValue = "hello world";
alert(stringValue.slice(-3)); //"rld"
alert(stringValue.substring(-3)); //"hello world"
alert(stringValue.substr(-3)); //"rld"
alert(stringValue.slice(3, -4)); //"lo w"
alert(stringValue.substring(3, -4)); //"hel"
alert(stringValue.substr(3, -4)); //"" (空字符串)
var person = {};
Object.defineProperty(person, "name", {
writable: false,
value: "Nicholas"
});
alert(person.name); //"Nicholas"
person.name = "Greg";
alert(person.name); //"Nicholas"
DataPropertiesExample01.htm
这个例子创建了一个名为 name 的属性,它的值"Nicholas"是只读的。这个属性的值是不可修改
的,如果尝试为它指定新值,则在非严格模式下,赋值操作将被忽略;在严格模式下,赋值操作将会导
致抛出错误。
相关文章推荐
- Javascript 严格模式详解
- Javascript 严格模式详解
- 关于javascript严格模式下七种禁止使用的写法
- JavaScript严格模式有什么不同
- javascript严格模式记录
- javascript中的严格模式
- javascript中的严格模式
- Javascript 严格模式详解 (主要是function的this指针可以为空了!)
- JavaScript起点(严格模式深度了解)
- Javascript 严格模式详解
- JavaScript——Javascript严格模式笔记
- javascript(EcmaScript 5)的严格模式
- [转]Javascript 严格模式详解
- 如何从Rational Quality Manager中获取执行结果的模式
- 深入理解javascript严格模式(Strict Mode)
- JavaScript严格模式详解
- Javascript 严格模式详解
- 是时候开始使用JavaScript严格模式了
- JavaScript严格模式(use strict)
- JavaScript严格模式