<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## 變量類型 JavaScript 是一種弱類型腳本語言,所謂弱類型指的是定義變量時,不需要什么類型,在程序運行過程中會自動判斷類型。 ECMAScript 中定義了 6 種原始類型: * Boolean * String * Number * Null * Undefined * Symbol(ES6 新定義) **注意**:原始類型不包含 Object。 > 題目:類型判斷用到哪些方法? ### `typeof` `typeof xxx`得到的值有以下幾種類型:`undefined boolean numbe string object function`、`symbol`,比較簡單,不再一一演示了。這里需要注意的有三點: * `typeof null`結果是`object`,實際這是`typeof`的一個bug,null是原始值,非引用類型 * `typeof [1, 2]`結果是`object`,結果中沒有`array`這一項,引用類型除了`function`其他的全部都是`object` * `typeof Symbol()`用`typeof`獲取`symbol`類型的值得到的是`symbol`,這是 ES6 新增的知識點 ### `instanceof` 用于實例和構造函數的對應。例如判斷一個變量是否是數組,使用`typeof`無法判斷,但可以使用`[1, 2] instanceof Array`來判斷。因為,`[1, 2]`是數組,它的構造函數就是`Array`。同理: ~~~ function Foo(name) { this.name = name } var foo = new Foo('bar') console.log(foo instanceof Foo) // true ~~~ > 題目:值類型和引用類型的區別 ### 值類型 vs 引用類型 除了原始類型,ES 還有引用類型,上文提到的`typeof`識別出來的類型中,只有`object`和`function`是引用類型,其他都是值類型。 根據 JavaScript 中的變量類型傳遞方式,又分為**值類型**和**引用類型**,值類型變量包括 Boolean、String、Number、Undefined、Null,引用類型包括了 Object 類的所有,如 Date、Array、Function 等。在參數傳遞方式上,值類型是按值傳遞,引用類型是按共享傳遞。 下面通過一個小題目,來看下兩者的主要區別,以及實際開發中需要注意的地方。 ~~~ // 值類型 var a = 10 var b = a b = 20 console.log(a) // 10 console.log(b) // 20 ~~~ 上述代碼中,`a``b`都是值類型,兩者分別修改賦值,相互之間沒有任何影響。再看引用類型的例子: ~~~ // 引用類型 var a = {x: 10, y: 20} var b = a b.x = 100 b.y = 200 console.log(a) // {x: 100, y: 200} console.log(b) // {x: 100, y: 200} ~~~ 上述代碼中,`a``b`都是引用類型。在執行了`b = a`之后,修改`b`的屬性值,`a`的也跟著變化。因為`a`和`b`都是引用類型,指向了同一個內存地址,即兩者引用的是同一個值,因此`b`修改屬性時,`a`的值隨之改動。 再借助題目進一步講解一下。 > 說出下面代碼的執行結果,并分析其原因。 ~~~ function foo(a){ a = a * 10; } function bar(b){ b.value = 'new'; } var a = 1; var b = {value: 'old'}; foo(a); bar(b); console.log(a); // 1 console.log(b); // value: new ~~~ 通過代碼執行,會發現: * `a`的值沒有發生改變 * 而`b`的值發生了改變 這就是因為`Number`類型的`a`是按值傳遞的,而`Object`類型的`b`是按共享傳遞的。 JS 中這種設計的原因是:按值傳遞的類型,復制一份存入棧內存,這類類型一般不占用太多內存,而且按值傳遞保證了其訪問速度。按共享傳遞的類型,是復制其引用,而不是整個復制其值(C 語言中的指針),保證過大的對象等不會因為不停復制內容而造成內存的浪費。 引用類型經常會在代碼中按照下面的寫法使用,或者說**容易不知不覺中造成錯誤**! ~~~ var obj = { a: 1, b: [1,2,3] } var a = obj.a var b = obj.b a = 2 b.push(4) console.log(obj, a, b) ~~~ ![](https://img.kancloud.cn/e6/0a/e60a0276151e26500786cb889c7173d2_321x413.png) 雖然`obj`本身是個引用類型的變量(對象),但是內部的`a`和`b`一個是值類型一個是引用類型,`a`的賦值不會改變`obj.a`,但是`b`的操作卻會反映到`obj`對象上。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看