享你所想 發表於 2019-6-26 15:57:00

JavaScript规定了几种语言类型?

<p class="md-end-block"><span>JavaScript中的每一个值都有它自己的类型,JavaScript规定了七种语言类型:</span></p>
<p class="md-end-block"><span>1.Undefined</span></p>
<p class="md-end-block"><span><span class="md-softbreak"><span>2.Null</span></span></span></p>
<p class="md-end-block"><span><span class="md-softbreak"><span><span class="md-softbreak"><span>3.Boolean</span></span></span></span></span></p>
<p class="md-end-block"><span><span class="md-softbreak"><span><span class="md-softbreak"><span><span class="md-softbreak"><span>4.String</span></span></span></span></span></span></span></p>
<p class="md-end-block"><span><span class="md-softbreak"><span><span class="md-softbreak"><span><span class="md-softbreak"><span><span class="md-softbreak"> <span>5.Number</span></span></span></span></span></span></span></span></span></p>
<p class="md-end-block"><span><span class="md-softbreak"><span><span class="md-softbreak"><span><span class="md-softbreak"><span><span class="md-softbreak"><span><span class="md-softbreak"><span>6.Symbol</span></span></span></span></span></span></span></span></span></span></span></p>
<p class="md-end-block"><span><span class="md-softbreak"><span><span class="md-softbreak"><span><span class="md-softbreak"><span><span class="md-softbreak"><span><span class="md-softbreak"><span><span class="md-softbreak"><span>7.Object</span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<h3 class="md-end-block md-heading"><span>Undefined和Null</span></h3>
<p class="md-end-block"><span>:为什么有的编程规范要求用 void 0 代替 undefined?</span></p>
<h3 class="md-end-block md-heading"><span>undefined</span></h3>
<p class="md-end-block"><span>undefined类型表示未定义,它的值只有一个:undefined<span class="md-softbreak"> <span>任何变量赋值前都是undefined类型,值为undefined(而不是null)<span class="md-softbreak"> <span>undefined是一个变量,而非一个关键字<span class="md-softbreak"> <span>需要表达这个值,可以用全局变量undefined,或者void运算<span class="md-softbreak"> <span>undefined是一个变量,我们避免无意中被篡改,建议使用void 0来获取undefined(等价于void (0) )。我们一般不会把变量赋值为undefined,这样可以保证所有的值为undefined的变量,都是从未赋值的自然状态。</span></span></span></span></span></span></span></span></span></p>
<h3 class="md-end-block md-heading"><span>void运算</span></h3>
<p class="md-end-block"><span>语法:void express 或者 void (express)<span class="md-softbreak"> <span>void运算符所做的是,执行表达式express,然后不论表达式是否有返回值,一律返回undefined。<span class="md-softbreak"> <span>void运算符如果使用括号,括号内必须有表达式,如果是void()会被视为执行名为void的函数,报错:SyntaxError。</span></span></span></span></span></p>
<h3 class="md-end-block md-heading"><span>死链接</span></h3>
<p class="md-end-block"><span>我们有时候会用href="#"来表示死链接,但是这样会导致页面跳到最上面的视图,#包含了一个位置信息,默认的锚是#top,也就是网页的上端。在页面很长的时候会使用#来定位页面的具体位置,格式为:#+id</span></p>
<p class="md-end-block"><span>href=javascript:void(0)用来禁止a标签的跳转行为,<span><strong>javascript:</strong><span>是伪协议,表示url的内容通过JavaScript执行,<span><strong>void(0)</strong><span>表示不作任何操作。</span></span></span></span></span></p>
<p class="md-end-block"><span class="md-tag md-raw-inline">&lt;a href="javascript: void(0)" onClick="window.open()"&gt;<span class="md-comment">&lt;!--点击链接后页面不动,只打开链接--&gt;<span class="md-softbreak"> <span class="md-tag md-raw-inline">&lt;a href="#" onClick="javascript: return false"&gt;<span class="md-comment">&lt;!--作用一样--&gt;</span></span></span></span></span></p>
<h3 class="md-end-block md-heading"><span>Null</span></h3>
<p class="md-end-block"><span>只有一个值,就是null<span class="md-softbreak"> <span>表示空值,是关键字,可以放心使用null关键字来获取null值</span></span></span></p>
<p class="md-end-block"><span>String<span class="md-softbreak"> <span>string的意义并非“字符串”,而是字符串的UTF16编码,字符串的最大长度实际上是受字符串编码长度影响的。最大长度:253 - 1 。<span class="md-softbreak"> <span>字符串是永远无法变更的,一旦字符串被构造出来,无法用任何方式改变字符串的内容。<span class="md-softbreak"> <span>字符串把每个UTF16单元当做一个字符来处理,所以处理非BMP(超出 U+0000 - U+FFFF 范围)的字符时,应该格外小心。这个设计继承自Java,现实中很少用到BMP之外的字符。</span></span></span></span></span></span></span></p>
<h3 class="md-end-block md-heading"><span>Number</span></h3>
<p class="md-end-block"><span>为什么在 JavaScript 中,0.1+0.2 不等于0.3?</span></p>
<p class="md-end-block"><span>number类型有264- 253+3 个值。<span class="md-softbreak"> <span>基本符合 IEEE 754-2008 规定的双精度浮点数规则,但也有额外几个表达的语言场景(比如不让除以0出错,引入了无穷大)。<span class="md-softbreak"> <span>NaN,占用了 9007199254740990,这原本是符合 IEEE 规则的数字<span class="md-softbreak"> <span>Infinity,无穷大<span class="md-softbreak"> <span>-Infinity,负无穷大<span class="md-softbreak"> <span>有+0和-0,加法运算中没有区别,但是除法要区分,“忘记检测除以 -0,而得到负无穷大”的情况经常会导致错误,而区分 +0 和 -0 的方式,正是检测 1/x 是 Infinity还是-Infinity<span class="md-softbreak"> <span>根据双精度浮点数定义,有效的整数范围是 -0x1fffffffffffff 至 0x1fffffffffffff,无法精确表示此范围外的整数。<span class="md-softbreak"> <span>根据双精度浮点数定义,非整数的Number类型无法用==来比较(三个等号也不行),正确的比较方法是用JavaScript提供的最小精度值:</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></p>
<p class="md-end-block"><span>console.log( 0.1 + 0.2 == 0.3);//false<span class="md-softbreak"> <span>//正确的比较方法</span></span></span></p>
<p class="md-end-block"><span><span class="md-softbreak"><span><span class="md-softbreak"> <span>console.log( Math.abs(0.1 + 0.2 - 0.3) &lt;= Number.EPSILON);//true</span></span></span></span></span></p>
<h3 class="md-end-block md-heading"><span>Symbol</span></h3>
<p class="md-end-block"><span>表示独一无二的值,它是一切非字符串的对象key的集合。<span class="md-softbreak"> <span>Symbol 值通过Symbol函数生成。这就是说,对象的属性名现在可以有两种类型,一种是原来就有的字符串,另一种就是新增的 Symbol 类型。凡是属性名属于 Symbol 类型,就都是独一无二的,可以保证不会与其他属性名产生冲突。<span class="md-softbreak"> <span>Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,但是即使描述相同,Symbol值也不相等。</span></span></span></span></span></p>
<p class="md-end-block"><span>let s1 = Symbol('foo');<span class="md-softbreak"> <span>let s2 = Symbol('foo');</span></span></span></p>
<p class="md-end-block"><span>s1 === s2 // false</span></p>
<p class="md-end-block"><span>一些标准中提到的 Symbol,可以在全局的 Symbol 函数的属性中找到。例如,我们可以使用 Symbol.iterator 来自定义 for…of 在对象上的行为:<span class="md-softbreak"> <span>var o = new Object</span></span></span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span>o = function() {<br><span> &nbsp;var v = 0<br><span> &nbsp;return {<br><span> &nbsp; &nbsp; &nbsp;next: function() {<br><span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return { value: v++, done: v &gt; 10 }<br><span> &nbsp; &nbsp; &nbsp;}<br><span> &nbsp;} &nbsp; &nbsp; &nbsp; &nbsp;<br><span>};<br><span><span>​<br><span>for(var v of o) <br><span> &nbsp;console.log(v); // 0 1 2 3 ... 9</span></span></span></span></span></span></span></span></span></span></span></span></pre>
<h3 class="md-end-block md-heading"><span>Object</span></h3>
<p class="md-end-block"><span>问题:为什么给对象添加的方法能用在基本类型上?</span></p>
<p class="md-end-block"><span>JavaScript对象的定义是“属性的集合”。属性分为数据属性和访问器属性,二者都是 key-value 结构,key可以是字符串或者Symbol类型。<span class="md-softbreak"> <span>JavaScript的“类”仅仅是运行时对象的一个私有属性,而JavaScript中是无法自定义类型的。<span class="md-softbreak"> <span>Number、String 和 Boolean,三个构造器是两用的,当跟 new 搭配时,它们产生对象,当直接调用时,它们表示强制类型转换。<span class="md-softbreak"> <span>Symbol 函数比较特殊,直接用 new 调用它会抛出错误,但它仍然是Symbol对象的构造器。<span class="md-softbreak"> <span>我们在原型上添加方法,都可以应用于基本类型。<span class="md-softbreak"> <span> Symbol.prototype.hello = () =&gt; console.log("hello");</span></span></span></span></span></span></span></span></span></span></span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span>var a = Symbol("a");<br><span>console.log(typeof a); //symbol,a 并非对象<br><span>a.hello(); //hello,有效</span></span></span></pre>
<p class="md-end-block"><span class="md-softbreak"> <span>上述问题的答案是:运算符提供了装箱操作,它会根据基础类型构造一个临时对象,使得能够在基础类型上调用对应对象的方法。</span></span></p>
<h3 class="md-end-block md-heading"><span>装箱和拆箱</span></h3>
<p class="md-end-block"><span>装箱转换:基本类型–&gt;对象</span></p>
<p class="md-end-block"><span>每一种基本类型,都在对象中有对应的类,装箱机制会频繁产生临时对象。<span class="md-softbreak"> <span>使用object函数,可以显示调用装箱能力。<span class="md-softbreak"> <span>每一类装箱对象皆有私有的 Class 属性,这些属性可以Object.prototype.toString 获取。在 JavaScript 中,没有任何方法可以更改私有的Class 属性,因此 Object.prototype.toString 是可以准确识别对象对应的基本类型的方法,它比 instanceof 更加准确。<span class="md-softbreak"> <span>call函数本身会产生装箱操作,需要配合typeof来区分基本类型还是对象类型。<span class="md-softbreak"> <span>拆箱转换:对象–&gt;基本类型</span></span></span></span></span></span></span></span></span></p>
<p class="md-end-block"><span>ToPrimitive 函数,它是对象类型到基本类型的转换<span class="md-softbreak"> <span>拆箱转换会尝试调用 valueOf 和 toString 来获得拆箱后的基本类型。如果valueOf 和 toString都不存在,或者没有返回基本类型,则会产生TypeError。<span class="md-softbreak"> <span>对象的运算</span></span></span></span></span></p>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span>var o = {<br><span> &nbsp;valueOf : () =&gt; {console.log("valueOf"); return {}},<br><span> &nbsp;toString : () =&gt; {console.log("toString"); return {}}<br><span>}<br><span><span>​<br><span>o * 2<br><span>// valueOf<br><span>// toString<br><span>// TypeError</span></span></span></span></span></span></span></span></span></span></pre>
<h3 class="md-end-block md-heading"><span>String的拆箱</span></h3>
<pre class="md-fences md-end-block ty-contain-cm modeLoaded"><span>var o = {<br><span> &nbsp;valueOf : () =&gt; {console.log("valueOf"); return {}},<br><span> &nbsp;toString : () =&gt; {console.log("toString"); return {}}<br><span>}<br><span><span>​<br><span>o + ""<br><span>// toString<br><span>// valueOf<br><span>// TypeError</span></span></span></span></span></span></span></span></span></span></pre>
<p class="md-end-block"><span class="md-softbreak"> <span>原文:<span class="md-link">https://blog.csdn.net/zhenghaohan1999/article/details/86697162</span></span></span></p>
<p class="md-end-block md-focus">&nbsp;<img src="https://img2018.cnblogs.com/blog/1698803/201906/1698803-20190626155541892-331188897.png"></p>

</div>
<div id="MySignature" role="contentinfo">
    你是什么样的人,便会遇到什么样的人;你想遇到什么样的人,就得先让自己成为那样的人。<br><br>
来源:https://www.cnblogs.com/angel648/p/11090366.html
頁: [1]
查看完整版本: JavaScript规定了几种语言类型?