本文作者:云初冀北

js的一些潜在规则使用分析

js的一些潜在规则使用分析摘要: 为什么开发中建议使用void 0 来代替undefined因为 JavaScript 的代码 undefined 是一个变量,而并非是一个关键字,这是JavaScript 语言公认...

?=为什么开发中建议使用voID 0 来代替undefined

因为 JavaScript代码 undefined 是一个变量,而并非是一个关键字,这是JavaScrIPt 语言公认的设计失误之一,所以,我们为了避免无意中被篡改,我建议使用void 0 来获取 undefined 值。

MDN上的解释: undefinedis a Property of theglobal object. That is, it is a variable in global scope. The initial value ofundefinedis the primitive valueundefined

为什么开发中将未赋值的变量赋值为null,而不是undefined

null 表示的是:“定义了但是为”。所以,在实际编程时,我们一般不会把变量赋值为 undefined,这样可以保证所有值为 undefined 的变量,都是从未赋值的自然状态。

string类型长度

因为 string 的意义并非“字符串”,而是字符串的 UTF16 编码,我们字符串的操作charAt、charcodeAt、length 等方法针对的都是 UTF16 编码。所以,字符串的最大长度,实际上是受字符串的编码长度影响的。

javaScript 中的字符串是永远无法变更的,一旦字符串构造出来,无法用任何方式改变字符串的内容,所以字符串具有值类型的特征。

JavaScript 字符串把每个 UTF16 单元当作一个字符来处理,所以处理非 BMP(超出U+0000 - U+FFFF 范围)的字符时,你应该格外小心。

"\uD835\uDD46" // "𝕆" "𝕆".length // 2 

为什么parseInt在将字符串转为数字的时候,需要指定第二个参数

在不传入第二个参数的情况下,parseint 只支持 16 进制前缀“0x”,而且会忽略非数字字符,也不支持科学计数法。

parseInt("0x1111") // 4369 parseInt(1e+40) // 1 

在一些古老的浏览器环境中,parseInt 还支持 0 开头的数字作为 8 进制前缀,这是很多错误的来源。所以在任何环境下,都建议传入 parseInt 的第二个参数,而 parseFlOAt 则直接把原字符串作为十进制来解析,它不会引入任何的其他进制。

多数情况下,Number 是比 parseInt 和 parseFloat 更好的选择

对象基本数据类型的规律

在 JavaScript 标准中,规定了 ToPrimitive 函数,它是对象型到基本类型的转换(即,拆箱转换)。

对象到 String 和 Number 的转换都遵循先拆箱再转换规则。通过拆箱转换,把对象变成基本类型,再从基本类型转换为对应的 String 或者 Number。

拆箱转换会尝试调用 valueOf 和 tostring 来获得拆箱后的基本类型。如果 valueOf 和toString 都不存在,或者没有返回基本类型,则会产生类型错误 typeError。

ES6 之后,还允许对象通过显式指定 @@toPrimitive Symbol 来覆盖原有的为。

Object.protoType[Symbol.toPrimitive] = functiON() {return '111'} const z = {name: 'zh0'} String(z) // "111" 

JavaScript 中对象独有的特色

对象具有高度的动态性,这是因为 JavaScript 赋予了使用者在运行时为对象添改状态和行为的能力。

为了提高抽象能力,JavaScript 的属性被设计成比别的语言更加复杂的形式,它提供了数据属性和访问器属性(Getter/setter)两类。

es5 开始,[[class]]私有属性被 Symbol.toStringtag 代替,Object.prototype.toString 的意义从命名上不再跟 class 相关。我们甚至可以自定义一个类的class。

var o = { [Symbol.toStrinGTAg]: "MyObject" } console.log(o + ""); // [object MyObject] 

JavaScript对象分类

宿主对象

宿主对象(host ObjecTS):由 JavaScript 宿主环境提供的对象,它们的行为完全由宿主环境决定。宿主对象也分为固有的和用户可创建的两种。

例如我们可以通过DOM操作创建一些对象。

JS运行时,也会创建一些对象(window, 一些构造方法等等)

内置对象

内置对象(BUIlt-in Objects):由 JavaScript 语言提供的对象。

固有对象(Intrinsic Objects ):由标准规定,随着 JavaScript 运行时创建而自动创建的对象实例

固有对象在任何 js 代码执行前就已经被创建出来了,它们通常扮演着类似基础的角色

三个值:Infinity、NaN、undefined。 九个函数: eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent 一些构造器:Array、Date、regexpPromiseProxyMap、Weakmap、Set、WeapSet、Function、Boolean、 String、Number、Symbol、Object、Error、EvalError、RangeError、ReferenceError、syntaxError、 TypeErrorURIError、ArrayBuffer、SharedArrayBuffer、DataView、Typed Array、Float32Array、 Float64Array、Int8Array、Int16Array、Int32Array、UInt8Array、UInt16Array、UInt32Array、 UInt8ClampedArray。 四个用于当作命名空间的对象: Atomics JSON Math reflect 
原生对象(Native Objects):可以由用户通过 Array、RegExp 等内置构造器或者特殊语法创建的对象。

能够通过语言本身的构造器创建的对象称作原生对象。

js的一些潜在规则使用分析

几乎所有这些构造器的能力都是无法用纯 JavaScript 代码实现的,它们也无法用class/extend 语法来继承。

所有这些原生对象都是为了特定能力或者性能,而设计出来的“特权对象”。

普通对象(OrDInary Objects):由{}语法、Object 构造器或者 class 关键字定义类创建的对象,它能够被原型继承。

特殊行为对象

Array:Array 的 length 属性根据最大的下标自动发生变化。Object.prototype:作为所有正常对象的默认原型,不能再给它设置原型了。String:为了支持下标运算,String 的正整数属性访问会去字符串里查找arguments:arguments 的非负整数型下标属性跟对应的变量联动。模块的 namespace 对象:特殊的地方非常多,跟一般对象完全不一样,尽量只用于import 吧。类型数组和数组缓冲区:跟内存块相关联,下标运算比较特殊。bind 后的 function:跟原来的函数相关联。

以上就是js的一些潜在规则使用分析的详细内容,更多关于js潜在规则的资料请关注云初冀北其它相关文章!

免责声明
本站提供的资源,都来自网络,版权争议与本站无关,所有内容及软件的文章仅限用于学习和研究目的。不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负,我们不保证内容的长久可用性,通过使用本站内容随之而来的风险与本站无关,您必须在下载后的24个小时之内,从您的电脑/手机中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。侵删请致信E-mail:Goliszhou@gmail.com
$

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

阅读
分享

发表评论

快捷回复:

评论列表 (暂无评论,84人围观)参与讨论

还没有评论,来说两句吧...