不同JS环境use strict对反复属性处理的差异

昨天改一个Bug不小心属性名反复了,引出了一个非常有意思的小Bug。导致Bug产生的是一段JS对象声明的代码。其结构与例如以下代码等价。

var fn = function() {
    ‘use strict‘;
     var obj =  {
        a: 1,
        a: 2       // 由于声明的属性比較多,后面加入的属性不小心与已有的属性反复了
     };
     return obj
};

fn();

当时自己在PC的chrome中測试了程序,执行没问题。也在安卓机上做了測试。也没问题。但在iphone中却报错了,导致页面无法正常渲染。通过Safari连接手机进行调试非常easy的定位到了出错的代码。从而发现这个非常有意思的问题:不同的JS执行环境下严格模式对反复属性的处理策略各有不同。以下我们看下各个执行环境对这段代码的执行情况

  • chrome
  • safari

  • Firefox
  • nodejs

从上面的实验结果能够看出,即使在严格模式下,各个执行环境对部分细节的处理也是不尽同样的。safari和nodejs的严格模式下对象字面量禁止反复属性声明,而chrome和Firefox则没有这方面的限制。chrome和nodejs按说用的同一个脚本引擎,理应表现一致才对,出现这个的差异有点让人费劲。所以即使严格模式下执行通过的代码也不是100%保险的,多做測试还是很必要的。

时间: 2024-12-17 23:31:45

不同JS环境use strict对反复属性处理的差异的相关文章

不同JS环境use strict对重复属性处理的差异

昨天改一个Bug不小心属性名重复了,引出了一个很有意思的小Bug.导致Bug产生的是一段JS对象声明的代码,其结构与如下代码等价. var fn = function() { 'use strict'; var obj = { a: 1, a: 2 // 因为声明的属性比较多,后面添加的属性不小心与已有的属性重复了 }; return obj }; fn(); 当时自己在PC的chrome中测试了程序,运行没问题,也在安卓机上做了测试,也没问题.但在iphone中却报错了,导致页面无法正常渲染.

js面对对象编程(二):属性和闭包

上篇博客中讲解了一些js对象的基本概念和用法,这篇博客讲解一下js属性方面的:公有属性,私有属性,特权方法. 如果学过java,公有属性,私有属性,特权方法(即可以访问和设置私有属性的方法)一定很熟悉,那么让我们来看看在js里如何实现呢? 1.公有属性 首先看公有的第一层意思是可以被大家所访问的,对外开放的属性,是相对于私有属性而言的: function Person(name,age){ this.name=name; this.age=age; this.getName=function()

手把手教你webpack、react和node.js环境配置(上篇)

很多人刚学习react的时候,往往因为繁琐的配置而头疼,这里我将手把手教大家怎么用webpack配置react和redux的环境,这篇教程包括前端react和后台node整个网站的环境配置,对node没兴趣的可以只看这篇. 这里是下篇链接:手把手教你webpack.react和node.js环境配置(下篇) 我把所有代码都放到了github上面供参考:webpack-react-express环境配置 1. 什么是webpack? Webpack 是当下最热门的前端资源模块化管理和打包工具.它可

paip.最好的脚本语言node js 环境搭建连接mysql

6.4 一些说明 数据属性可以重写同名的方法属性.这是为了避免在大型系统中产生问题的意外名称冲突.所以用一些减少冲突的常用方法是很有效果的.常用的方法包括:大写字母方法名称,用唯一的字符串来做为数据属性的名称(可以是个下划线_)或者用动词命名方法和用名字命名数据属性. 数据属性就像和对象的普通用户一样可以被方法引用.换句话说,类不能用来实现纯净的数据类型.事实上,在python中不能强制数据隐藏,一切基于约定.(另一方面,如C中写的,python的实现可以做到完全隐藏实现细节并且在必要是可以控制

Node.js环境搭建&&npm安装

Node.js环境搭建 第一步:进入官网,然后直接点击左边的下载左边的部分,因为其提示 “Recommended For Most Users”. 第二步:下载得到的是msi文件,直接双击安装,一路next即可安装完成. 第三步:这时,我们就可以在“开始”中找到最新添加了两项内容,可以创建快捷方式到桌面上方便使用.如图: 第四步:安装完成后,按下win+R ,然后输入cmd后进入dos窗口,直接输入 node -v,这时我们可以看到你所安装的版本号,表示安装成功,如下所示: 第五步:npm安装.

HTML5 画布上的 Three.js 环境灯光(HTML5 Canvas Three.js Ambient Lighting)

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. HTML5 画布上的 Three.js 环境灯光HTML5 Canvas Three.js Ambient Lighting <!DOCTY

centos 安装node js环境

node.js支持多种平台安装,其中Win平台安装比较简单,下面重点讲解下Linux平台的安装步骤.本文以CentOS平台为实例,不准备讲 解采取源码编译安装方式,而是采取在node.js网站下载已经编译好的可执行包,解压安装并设置部分环境变量,因此整个过程非常简单. 1.下载并解压最新的node.js安装包 (Linux平台编译好的文件是 Linux Binaries (.tar.gz) ) 网站地址为:http://www.nodejs.org/download/ ,可在页面上发现nodej

webpack-vue.js环境

安装webpack 在安装webpack之前,本地需要先配置node.js环境 由于npm安装速度慢,首先安装淘宝镜像cnpm //命令行 npm install cnpm -g 使用cnpm安装webpack //命令行 cnpm install webpack -g -g代表全局 安装webpack完成 注意: vue.js不支持IE8及其以下版本,因为vue.js使用了IE8不能模拟的ECMAScript5特性.vue.js支持所有兼容ECMAScript5的浏览器. 安装vue.js /

win 环境下 node.js环境变量

 在win 环境下 node.js环境变量有两种情况:  (1)开发环境(development):开发环境是程序猿们专门用于开发的服务器,配置可以比较随意, 为了开发调试方便,一般打开全部错误报告. (2)生产环境(production):是指正式提供对外服务的,一般会关掉错误报告,打开错误日志. 代码: if (process.env.NODE_ENV === 'production') { //在生产情况下做怎样的处理 /* 你的代码*/} else { //在开发环境下做怎样的处理 /*