您的位置:首页 > Web前端 > JavaScript

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 ,因为基本类型不是对象。



优化内存占用的最佳方式,就是为执行

中的代码只保存必要的数据。一旦数据不再有用,最好通过将其值设置为 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"是只读的。这个属性的值是不可修改
的,如果尝试为它指定新值,则在非严格模式下,赋值操作将被忽略;在严格模式下,赋值操作将会导
致抛出错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: