「译」JavaScript 的怪癖 1:隐式类型转换

原文:JavaScript quirk 1: implicit conversion of values

译文:「译」JavaScript 的怪癖 1:隐式类型转换

译者:justjavac


零:提要

[此贴子是 javascript 的 12 个怪癖(quirks) 系列的第一篇。]

JavaScript 是非常宽容的,「来者不拒」,不在乎什么类型。 例如,它如果想要接受数字,它并不拒绝其他类型的值,而是试图把它们转换成数字:

> '5' - '2'
3
> '5' * '2'
10

自动转换为布尔值通常不会引起问题,而且往往很有用(译注:比如在C语言里,根本就没有布尔类型。by @justjavac)。 即使如此,这些隐式转换也会引起怪癖(quirks)。 但是当自动转换为字符串时,可能会引起问题。

一:隐式转换为布尔:“truthy”和“falsy”

当 JavaScript 需要一个布尔值时(例如:if 语句),任何值都可以被使用。 最终这些值将被转换为 true 或false。

下面的值被转换为 false:

  • undefined, null
  • Boolean: false
  • Number: -0, +0, NaN
  • String: ''

所有其他值都认为是 true。 被转换成 'false' 的值我们成之为 falsy,被转换成 'true' 的值我们成之为 truthy。 您可以使用 Boolean 来测试一个值到底被转换成了什么。

Boolean 将其参数转换为布尔值(boolean):

> Boolean(undefined)
false
> Boolean(0)
false
> Boolean(3)
true

二、字符串的隐式转换

在 Web 开发中,我们经常得到字符串值,实际上我们期望的却是数字或者布尔值。 例如,用户输入的表单中的数据。 如果你忘了对这些字符串进行显式的转换,那么 JavaScript 会令你感到惊讶,主要体现在两个方面:

  1. 首先,系统不会有任何警告。
  2. 其次,这些值将被自动转换,但确实错误的。

例如,加运算符(+),就有这方面的问题,因为只要其中一个操作数是字符串,那么它就执行连接字符串的操作(而不是加法操作,即使它们是数字)。

在下面的 JavaScript 代码中,我们本来预期是把 1 和 5 相加。 但是,我们使用了字符串 '5' 和 '1' 。

> var x = '5';  // 错误的假设:x 是一个数字

> x + 1
'51'

此外,还有一些看似是 false 的值,如果转换成字符串,却成了 'true'。

例如:false。

> Boolean(false)
false
> String(false)
'false'
> Boolean('false')  // !!
true

例如: undefined.

> Boolean(undefined)
false
> String(undefined)
'undefined'
> Boolean('undefined')  // !!
true

三、对象的隐式转换

只有在 JavaScript 表达式或语句中需要用到数字或字符串时,对象才被隐式转换。 当需要将对象转换成数字时,需要以下三个步骤:

  1. 调用 valueOf()。如果结果是原始值(不是一个对象),则将其转换为一个数字。
  2. 否则,调用 toString() 方法。如果结果是原始值,则将其转换为一个数字。
  3. 否则,抛出一个类型错误。

第一步示例:

> 3 * { valueOf: function () { return 5 } }
15

第三步示例:

> function returnObject() { return {} }
> 3 * { valueOf: returnObject, toString: returnObject }
TypeError: Cannot convert object to primitive value

如果把对象转换成字符串时,则转换操作的第一步和第二步的顺序会调换: 先尝试 toString() 进行转换,如果不是原始值,则再尝试使用 valueOf()。

四、相关阅读

  1. JavaScript中,{}+{}等于多少?
  2. JavaScript:将所有值都转换成对象
  3. 为什么 ++[[]][+[]]+[+[]] = 10?
一、C++反作弊对抗实战 (基础篇 —— 2.注册表注入DLL) 在Windows NT/XP操作系统中,当需要加载user32.dll的程序启动时,user32.dll会加载注册表键HLM\Software\Microsoft\WindowsNT\CurrentVersion\Windows\AppInit_dlls下面列出的所有模块。 阅读详情

相关推荐

机载电脑与飞控串口通信(实测读取飞控IMU数据)《一、香橙派5max启动串口UART通信与飞控板通信,一次必通!》《二、allspark1与PIX6C通信踩坑及出坑》《三、orinnx载板与飞控通信》

机载电脑与飞控串口通信(实测读取飞控IMU数据)《一、香橙派5max启动串口UART通信与雷迅v5nano飞控板通信,一次必通!》《二、阿木机载电脑allspark1与PIX6C通信踩坑及出坑》,还有如何打开飞控串口以及如何提高飞控IMU频率。

2402_82745259的博客 3469

script转java_java script 数据类型的隐式与强制转换

隐式转换前提 定义一个数字类型 与js基本类型相乘var a=1;var b;var c= a*b;字符隐式转数字b=‘123’时     c=123;b='123a'时    c=NaN;布尔隐式转数字b=true       c=1;b=false c=0;b=null       c=0;b=undedined     c=NaN;...

weixin_29204121的博客 150

AMG8833红外测温实战:在STM32F103上做个简易人体感应与温度报警器

本文详细介绍了如何在STM32F103上使用AMG8833红外测温传感器构建人体感应与温度报警系统。通过硬件连接方案、驱动代码开发、人体检测算法实现及报警系统设计,展示了如何利用8x8红外温度矩阵实现智能监测功能。文章包含实用的初始化流程、温度数据读取优化和低功耗策略,为创客项目提供完整解决方案。

weixin_33725239的博客 392

隐式类型转换

隐式转化介绍 在js中,当运算符在运算时,如果两边的数据类型不同意,CPU就无法计算,这时编译器会自动将两边的数据做一个数据类型转换,转成一样的类型再计算. 隐式转换规则 转换成string类型: + (字符串连接符) 转成number类型: ++/-- (自增运算符) + - * / % (算术运算符) > < >= <= == != === !===...

sunny1660的博客 517

安卓设备通过USB串口与STM32单片机通讯之一

这里写自定义目录标题欢迎使用Markdown编辑器`在这里插入代码片`新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器在这里插入代码片 你好下Markdown的基本语法知识。 新的改变 我们对

JGB联合商务组的博客 7244

RK3588 ENV 环境配置之 fw_printenv

RK3588 ENV环境配置指南 本文详细介绍了在RK3588平台上配置ENV环境变量的完整流程。首先需要在parameter分区表中划分env分区,然后在U-Boot中配置MMC偏移地址。接着编译fw_printenv工具并部署到目标设备,配置fw_env.config文件指定存储位置。重点解决了内核中读写ENV时遇到的CRC校验问题,通过U-Boot的saveenv命令初始化环境变量存储区域。最后展示了如何使用fw_printenv/fw_setenv工具在内核中读写ENV变量,并建议将配置集成到根文件

501846585_QQAndroid_java 1031

2020-11-04

记录2020-11-04前端学习脚步 总结:知识点比较容易理解,靠多敲代码,多使用可以掌握。 今天学习的知识点如下: *字面量 都是一些不可改变的值 * 比如 :1 2 3 4 5 * 字面量都是可以直接使用,但是我们一般都不会直接使用字面量 * * 变量 变量可以用来保存字面量,而且变量的值是可以任意改变的 * 变量更加方便我们使用,所以在开发中都是通过变量去保存一个字面量, * 而很少直接使用字面量 * 可以通过变量对字

weixin_50141423的博客 901

简单VASP计算INCAR设置(结构优化OPT、静态自洽SCF、能带BAND、态密度DOS)

改变 K 点、NBANDS、晶胞、ENCUT、POTCAR、自旋或 SOC 后要检查兼容性。该参数不参与物理计算,因此不会改变总能量、受力、应力或最终结构。如果研究的是金属、磁性材料、表面、二维材料、分子、缺陷、DFT+U、杂化泛函或强自旋轨道耦合体系,部分参数必须调整。适合已经用 IBRION = 2 预优化、力较小、自由度较多的结构。在 IBRION = 1、2、3 中,它只是内部缩放因子。“不能修改”不是程序禁止修改,而是修改后会改变理论模型、数值精度或能量参考,使结果不能直接比较。

weixin_51420530的博客 124

强制类型转换——String、隐式转换成String

强制类型转换——String 将其她的数据类型转换为String 方法一: 调用被转换的toString()方法; 该方法不会影响到原来变量,它会将转换的结果返回; 但是注意:null和undefined这两个值没有toString()方法,如果调用他们的方法,会报错;   方法二: 调用String()函数,并将被转换的数据作为参数传递给函数; 使用String()函数做强制类型...

JEFF_xieyuzhi的博客 3396

Linux系统安全学习手册

Linux反弹shell Linux系统应急响应 Linux服务器安全加固 Linux下的用户、组和权限 Linux中的gcc Linux中su和sudo的用法和区别 Linux系统python2与python3共存 Linux中grep工具的使用 Linux中环境变量的设置 Linux中常见的150个命令(干货) Linux中编写Shell脚本 LNMP环境搭建Wordpress博客 LAMP环境搭建一个Discuz论坛 Linux运维比较常用的一些脚本 Linux系统中安装软

谢公子的博客 7532

Deepfake检测模型-PyDeepFakeDet项目复现实验报告-深度学习

该实验是对于https://github.com/wangjk666/PyDeepFakeDet模型的复现。PyDeepFakeDet 是一款集成的、可扩展的 Deepfake 检测工具。目标是提供最先进的 Deepfake 检测模型以及用于在常用 Deepfake 数据集上训练和评估新模型的接口。

一位不是很硕的鉴伪方向硕士 5494

使用winform时,出现无法将类型“string”隐式转换为"System.Windows.Forms.TextBox"的错误。

已经犯了两次这个错误,我必须拿小本本把他记下来,不然对不起我自己。 如果出现这个问题,是因为在winform中,将某个控件的名称写成了Name 。 哎,说多了就是泪,拿小本本记下来,以后就不会犯错了。...

小田同學的博客 1万+

数字人接大模型第二步:语音克隆

推荐XTTS-v2项目,由Coqui公司开发的语音生成模型,专为多语言语音克隆和生成设计。它支持17种语言,包括英语、西班牙语、法语、德语、意大利语、葡萄牙语、波兰语、土耳其语、俄罗斯语、荷兰语、捷克语、阿拉伯语、中文、日语、匈牙利语、韩语和印地语。XTTS-v2的核心优势在于其仅需6秒的音频片段即可实现语音克隆,无需大量的训练数据。此外,它还支持情感和风格转移、跨语言语音克隆以及多语言语音生成,采样率高达24kHz。地址:https://github.com/archwesome/XTTS-v2。

403

JavaScript进阶系列-类型转换、隐式类型转换

我的博客仓库 类型转换、隐式类型转换 用来放一些我看的书籍和学习的记录,欢迎点赞和讨论。 转换为字符串 ECMAScript 的 Boolean 值、数字和字符串的原始值都是伪对象,这意味着它们可以使用原型对象上面的属性和方法。 ECMAScript 定义所有对象都有 toString() 方法,无论它是伪对象,还是真对象。 let obj = {name:'obj'}; obj.toStri...

weixin_34318326的博客 1193

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

JavaScript 隐式类型转换

JavaScript 是非常宽容的,「来者不拒」,不在乎什么类型。 例如,它如果想要接受数字,它并不拒绝其他类型的值,而是试图把它们转换成数字: > '5' - '2' 3 > '5' * '2' 10 自动转换为布尔值通常不会引起问题,而且往往很有用(译注:比如在C语言里,根本就没有布尔类型。by @justjavac)。 即使如此,这些隐式转换也会引起怪癖(quirks)。 但是当自动转换为字符串时,可能会引起问题。 一:隐式转换为布尔:“truthy”和“falsy” 当 JavaScr

树上骑个猴的博客 795

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

总结javascript的那些怪癖

/**  *  * @authors Benjamin(http://blog.youkuaiyun.com/cuew1987)  * @date    2013-11-29 14:04:00  * @content 总结javascript的那些怪癖(trick)     */ /**  * trick01:NaN是个数值  * NaN:表示某个值不是数值,但其本身又是数值,且不等于其自

Benjamin——前端攻城师 1584

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

JavaScript-怪癖检测

例如,IE8及更早版本中存在一个bug,即如果某个实例属性与标记为[[DontEnum]]的某个原型属性同名,那么该实例属性将不会出现在fon-in循环当中。一般来说,“怪癖”都是个别浏览器所独有的,而且通常被归为bug。由于检测“怪癖”涉及运行代码,因此我们建议仅检测那些对你有直接影响的“怪癖”,而且最好在脚本一开始就执行此类检测,以便尽早解决问题。如果浏览器存在这个bug,那么使用for-in循环枚举带有自定义的toString()方法的对象,就会返回两个toString的实例。

zf888999666的博客 203

JavaScript 怪癖

如果对你来说JavaScript还是一门全新的语言,或者你是在最近的开发中才刚刚对它有所了解,那么你可能会有些许挫败 感。任何编程语言都有它自己的怪癖(quirks)——然而,当你从那些强类型的服务器端语言转向JavaScript的时候 ,你会感到非常困惑。我就是这样!当我在几年前做全职JavaScript开发的时候,我多么希望关于这门语言的许多事情我能尽早地知道。我希望通过本文中分享的一些怪癖能

u010804100的专栏 605

javascript客户端检测 记录一些“怪癖”

因为市面上多种浏览器之间的差异,和不同浏览器的“怪癖”,所以我们在开发时可能需要客户端检测,确保自己的代码能顺利的在全部浏览器上运行 第一种最常用的客户端检测——能力检测。能力检测的目标不是识别特定的浏览器,而是识别浏览器的能力 if(object.propertyInQuestion){ //使用object.propertyInQuestion } 就是在运行代...

weixin_30851409的博客 70

js怪癖

偶然看见,问问那些不注重细节的童鞋,哈哈哈~ 问题:为什么 ++[[]][+[]]+[+[]] = 10? 原理:js的隐式类型转换 参考链接:http://justjavac.com/javascript/2012/12/20/object-plus-object.html 注意:js运算符优先级 运算符 描述 . [] () 字段访问、数

panying0903的专栏 1373

译文:Javascript的12个怪癖【未翻译完持续更新】

实际上javascript 是一个相当简洁的语言,但是也难免会有一些怪癖(quirks)。 这是这个系列的目录,可阅读已经译好的章节,也可收藏等待翻译完成。译者:justjavac 他在github上的原始目录:https://github.com/justjavac/12-javascript-quirks/blob/master/cn/content.md 原文:12 JavaScrip

kengdie1029的专栏 785

翻译编辑-JavaScript有关的10个怪癖和秘密

数据类型和定义 1. Null是个对象 JavaScript众多类型中有个Null类型,它有个唯一的值null, 即它的字面量,定义为完全没有任何意义的值。其表现得像个对象,如下检测代码: alert(typeof null); //弹出 'object' 您可以狠狠地点击这里:null为对象测试demo 如下截图: 尽管typeof值显示是"object",但n...

amsm18138的博客 189

JavaScript有关的10个怪癖和秘密

JavaScript有关的10个怪癖和秘密 发布时间: 2011-08-25 15:11  阅读: 2313 次  原文链接  全屏阅读 [收藏]   摘要:在本片文章中,作者将向您讲述JavaScript中最鲜为人知的秘密。   原文作者:Andy Cro

我的博客 797

说说 JavaScript 对浏览器的怪癖检测

怪癖检测指的是识别浏览器的特殊行为,就是浏览器的缺陷行为。通常是运行一段代码来确定某个特性不能正常工作。在 IE8以及更早的版本中存在着这样一个 bug:如果某个实例属性与标记为 [[DontEnum]] 的某个原型属性同名,那么这个实例属性不会出现在 for-in 循环中,因此可以这样检测://IE8 及早期版本,会把某个与原型属性同名的属性,排除在 for-in 循环外 var hasDontE

读万卷书,行万里路 1026
上一篇: mixin 模式看起来好像装饰器模式,究竟是一个什么样的模式
下一篇: 为什么说任何基于比较的算法将 5 个元素排序都需要 7 次?
SleepInDelphi
博客等级 码龄19年 32粉丝 388原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值