<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        JavaScript面向?qū)ο缶?上部)

        來源:懂視網(wǎng) 責編:小采 時間:2020-11-27 22:30:27
        文檔

        JavaScript面向?qū)ο缶?上部)

        JavaScript面向?qū)ο缶?上部):數(shù)據(jù)類型 在JavaScript中,數(shù)據(jù)類型分為兩類: 原始類型 保存一些簡單數(shù)據(jù),如true,5等。JavaScript共有5中原始類型: boolean:布爾,值為true或false number:數(shù)字,值為任何整型會浮點數(shù)值 string:字符串,值為由單引號或雙引號括出的單個字符或連續(xù)字
        推薦度:
        導(dǎo)讀JavaScript面向?qū)ο缶?上部):數(shù)據(jù)類型 在JavaScript中,數(shù)據(jù)類型分為兩類: 原始類型 保存一些簡單數(shù)據(jù),如true,5等。JavaScript共有5中原始類型: boolean:布爾,值為true或false number:數(shù)字,值為任何整型會浮點數(shù)值 string:字符串,值為由單引號或雙引號括出的單個字符或連續(xù)字

        數(shù)據(jù)類型

        在JavaScript中,數(shù)據(jù)類型分為兩類:

        原始類型

        保存一些簡單數(shù)據(jù),如true,5等。JavaScript共有5中原始類型:

        boolean:布爾,值為true或false
        number:數(shù)字,值為任何整型會浮點數(shù)值
        string:字符串,值為由單引號或雙引號括出的單個字符或連續(xù)字符(JavaScript不區(qū)分字符類型)
        null:空類型,其僅有一個值:nulll
        undefined:未定義,其僅有一個值:undefined

        var name = "Pomy";
        var blog = "http://www.ido321.com";
        var age = 22;
        alert(typeof blog); //"string"
        alert(typeof age); //"number"

        原始類型的值是直接保存在變量中,并可以用 typeof 進行檢測。但是typeof對null的檢測是返回object,而不是返回null:

        //彈出Not null
        if(typeof null){
         alert("Not null"); 
        }else{
         alert("null");
        }

        所以檢測null時,最好用全等于(===),其還能避免強制類型轉(zhuǎn)換:

        console.log("21" === 21); //false
        console.log("21" == 21); //true
        console.log(undefined == null); //true
        console.log(undefined === null); //false

        對于字符串、數(shù)字或者布爾值,其都有對應(yīng)的方法,這些方法來自于對應(yīng)的原始封裝類型:String、Number和Boolean。原始封裝類型將被自動創(chuàng)建。

        var name = "Pomy";
        var char = name.charAt(0);
        console.log(char); //"P"

        在JavaScript引擎中發(fā)生的事情:

        var name = "Pomy";
        var temp = new String(name);
        var char = temp.charAt(0);
        temp = null;
        console.log(char); //"P"

        字符串對象的引用在用完之后立即被銷毀,所以不能給字符串添加屬性,并且instanceof檢測對應(yīng)類型時均返回false:

        var name = "Pomy";
        name.age = 21;
        console.log(name.age); //undefined
        console.log(name instanceof String); //false

        引用類型

        保存為對象,實質(zhì)是指向內(nèi)存位置的引用,所以不在變量中保存對象。除了自定義的對象,JavaScript提供了6中內(nèi)建類型:

        Array:數(shù)組類型,以數(shù)字為索引的一組值的有序列表
        Date:日期和時間類型
        Error:運行期錯誤類型
        Function:函數(shù)類型
        Object:通用對象類型
        RegExp:正則表達式類型
        可以用new來實例化每一個對象,或者用字面量形式來創(chuàng)建對象:

        var obj = new Object;
        var own = {
         name:"Pomy",
         blog:"http://www.ido321.com",
         "my age":22
         };
        console.log(own.blog); //訪問屬性
        console.log(own["my age"]); 
        obj = null; //解除引用

        obj 并不包含對象實例,而是一個指向內(nèi)存中實際對象所在位置的指針(或者說引用)。因為typeof對所有非函數(shù)的引用類型均返回object,所以需要用instanceof來檢測引用類型。

        函數(shù)

        在JavaScript中,函數(shù)就是對象。使函數(shù)不同于其他對象的決定性特性是函數(shù)存在一個被稱為[[Call]]的內(nèi)部屬性。內(nèi)部屬性無法通過代碼訪問而是定義了代碼執(zhí)行時的行為。

        創(chuàng)建形式

        1、函數(shù)聲明:用function關(guān)鍵字,會被提升至上下文
        2、函數(shù)表達式:不能被提升
        3、實例化Function內(nèi)建類型

        sayHi(); //函數(shù)提升
        function sayHi(){
         console.log("Hello");
        }
        //其他等效等效方式
        /*
        var sayHi = function(){
         console.log("Hello");
        }
        var sayHi = new Function(" console.log(\"Hello\");");
        */

        參數(shù)

        JavaScript函數(shù)的另外一個獨特之處在于可以給函數(shù)傳遞任意數(shù)量的參數(shù)。函數(shù)參數(shù)被保存在arguments類數(shù)組對象中,其自動存在函數(shù)中,能通過數(shù)字索引來引用參數(shù),但它不是數(shù)組實例:

        alert(Array.isArray(arguments));   //false
        類數(shù)組對象arguments 保存的是函數(shù)的實參,但并不會忽略形參。因而,arguments.length返回實參列表的長度,arguments.callee.length返回形參列表的長度。

        function ref(value){
         return value;
        }
        console.log(ref("Hi"));
        console.log(ref("Hi",22));
        console.log(ref.length); //1

        函數(shù)中的this

        關(guān)于this的問題,可參考此文:JavaScript中的this。
        JavaScript提供了三個方法用于改變this的指向:call、apply和bind。三個函數(shù)的第一個參數(shù)都是指定this的值,其他參數(shù)均作為參數(shù)傳遞給函數(shù)。

        對象

        對象是一種引用類型,創(chuàng)建對象常見的兩種方式:Object構(gòu)造函數(shù)和對象字面量形式:

        var per1 = {
         name:"Pomy",
         blog:"http://www.ido321.com"
        };
        var per2 = new Object;
        per2.name = "不寫代碼的碼農(nóng)";

        屬性操作

        在JavaScript中,可以隨時為對象添加屬性:

        per1.age = 0;
        per1.sayName = function(){
         alert(this.name); //"Pomy"
        }

        因而,在檢測對象屬性是否存在時,常犯的一個錯誤是:

        //結(jié)果是false
        if(per1.age){
         alert(true)
        }else{
         alert(false);
        }

        per1.age 是存在的,但是其值是0,所以不能滿足if條件。if判斷中的值是一個對象、非空字符串、非零數(shù)字或true時,判斷會評估為真;而當值是一個null、undefined、0、false、NaN或空字符串時評估為假。

        因而,檢測屬性是否存在時,有另外的兩種方式:in和hasOwnProperty(),前者會檢測原型屬性和自有(實例)屬性,后者只檢測自有(實例)屬性。

        console.log("age" in per1); //true
        console.log(per1.hasOwnProperty("age")); //true
        console.log("toString" in per1); //true
        console.log(per1.hasOwnProperty("toString")); //false

        對象per1并沒有定義toString,該屬性繼承于Object.prototype,所以in和hasOwnProperty()檢測該屬性時出現(xiàn)差異。如果只想判斷一個對象屬性是不是原型,可以利用如下方法:

        function isPrototypeProperty(obj,name){
         return name in obj && !obj.hasOwnProperty(name);
        } 

        若要刪除一個屬性,用delete操作符,用于刪除自有屬性,不能刪除原型屬性。

        per1.toString = function(){
         console.log("per1對象");
        };
        console.log(per1.hasOwnProperty("toString")); //true
        per1.toString(); //"per1對象"
        delete per1.toString;
        console.log(per1.hasOwnProperty("toString")); //false
        console.log(per1.toString()); //[object Object]

        有時需要枚舉對象的可枚舉屬性,也有兩種方式:for-in循環(huán)和Object.keys(),前者依舊會遍歷出原型屬性,后者只返回自有屬性。所有可枚舉屬性的內(nèi)部屬性[[Enumerable]]的值均為true。

        var per3 = {
         name:"Pomy",
         blog:"http://www.ido321.com",
         age:22,
         getAge:function(){
         return this.age;
         }
        };

        實際上,大部分原生屬性的[[Enumerable]]的值均為false,即該屬性不能枚舉。可以通過propertyIsEnumerable()檢測屬性是否可以枚舉:

        console.log(per3.propertyIsEnumerable("name")); //true
        var pros = Object.keys(per3); //返回可枚舉屬性的名字數(shù)組
        console.log("length" in pros); //true
        console.log(pros.propertyIsEnumerable("length")); //false
        

        屬性name是自定義的,可枚舉;屬性length是Array.prototype的內(nèi)建屬性,不可枚舉。

        屬性類型

        屬性有兩種類型:數(shù)據(jù)屬性和訪問器屬性。二者均具有四個屬性特征:

        數(shù)據(jù)屬性:[[Enumerable]]、[[Configurable]]、[[Value]]和[[Writable]]
        訪問器屬性:[[Enumerable]]、[[Configurable]]、[[Get]]和[[Set]]
        **[[Enumerable]] :**布爾值,屬性是否可枚舉,自定義屬性默認是true。
        **[[Configurable]] :**布爾值,屬性是否可配置(可修改或可刪除),自定義屬性默認是true。它是不可逆的,即設(shè)置成false后,再設(shè)置成true會報錯。
        **[[Value]]:**保存屬性的值。
        **[[Writable]]:**布爾值,屬性是否可寫,所有屬性默認可寫。
        **[[Get]]:**獲取屬性值。
        **[[Set]]:**設(shè)置屬性值。

        ES 5提供了兩個方法用于設(shè)置這些內(nèi)部屬性:
        Object.defineProperty(obj,pro,desc_map) 和 Object.defineProperties(obj,pro_map)。利用這兩個方法為per3添加一個屬性和創(chuàng)建一個新對象per4:

        Object.defineProperty(per3,"sex",{
         value:"male",
         enumerable:false,
         configurable:false, //屬性不能刪除和修改,該值也不能被設(shè)置成true
        });
        console.log(per3.sex); //'male'
        console.log(per3.propertyIsEnumerable("sex")); //false
        delete per3.sex; //不能刪除
        per3.sex = "female"; //不能修改
        console.log(per3.sex); //'male'
        Object.defineProperty(per3,"sex",{
         configurable:true, //報錯
        });
        per4 = {};
        Object.defineProperties(per4,{
         name:{
         value:"dwqs",
         writable:true
         },
         blog:{
         value:"http://blog.92fenxiang.com"
         },
         Name:{
         get:function(){
         return this.name;
         },
         set:function(value){
         this.name = value;
         },
         enumerable:true,
         configurable:true
         }
        });
        console.log(per4.name); //dwqs
        per4.Name = "Pomy";
        console.log(per4.Name); //Pomy
        
        

        需要注意的是,通過這兩種方式來定義新屬性時,如果不指定特征值,則默認是false,也不能創(chuàng)建同時具有數(shù)據(jù)特征和訪問器特征的屬性。可以通過Object.getOwnPropertyDescriptor()方法來獲取屬性特征的描述,接受兩個參數(shù):對象和屬性名。若屬性存在,則返回屬性描述對象。

        var desc = Object.getOwnPropertyDescriptor(per4,"name");
        console.log(desc.enumerable); //false
        console.log(desc.configurable); //false
        console.log(desc.writable); //true

        根據(jù)屬性的屬性類型,返回的屬性描述對象包含其對應(yīng)的四個屬性特征。

        禁止修改對象

        對象和屬性一樣具有指導(dǎo)其行為的內(nèi)部特征。其中,[[Extensible]]是一個布爾值,指明改對象本身是否可以被修改([[Extensible]]值為true)。創(chuàng)建的對象默認都是可以擴展的,可以隨時添加新的屬性。
        ES5提供了三種方式:

        Object.preventExtensions(obj):創(chuàng)建不可擴展的obj對象,可以利用Object.isExtensible(obj)來檢測obj是否可以擴展。嚴格模式下給不擴展對象添加屬性會報錯,非嚴格模式下則添加失敗。
        Object.seal(obj):封印對象,此時obj的屬性變成只讀,不能添加、改變或刪除屬性(所有屬性都不可配置),其[[Extensible]]值為false,[[Configurable]]值為false。可以利用Object.isSealed(obj)來檢測obj是否被封印。
        Object.freeze(obj):凍結(jié)對象,不能在凍結(jié)對象上添加或刪除屬性,不能改變屬性類型,也不能寫入任何數(shù)據(jù)類型。可以利用Object.isFrozen(obj)來檢測obj是否被凍結(jié)。
        注意:凍結(jié)對象和封印對象均要在嚴格模式下使用。

        "use strict";
        var per5 = {
         name:"Pomy"
        };
        console.log(Object.isExtensible(per5)); //true
        console.log(Object.isSealed(per5)); //false
        console.log(Object.isFrozen(per5)); //false
        Object.freeze(per5);
        console.log(Object.isExtensible(per5)); //false
        console.log(Object.isSealed(per5)); //true
        console.log(Object.isFrozen(per5)); //true
        per5.name="dwqs";
        console.log(per5.name); //"Pomy"
        per5.Hi = function(){
         console.log("Hi");
        };
        console.log("Hi" in per5); //false
        delete per5.name;
        console.log(per5.name); //"Pomy"
        var desc = Object.getOwnPropertyDescriptor(per5,"name");
        console.log(desc.configurable); //false
        console.log(desc.writable); //false
        
        

        注意,禁止修改對象的三個方法只對對象的自有屬性有效,對原型對象的屬性無效,仍然可以在原型上添加或修改屬性。

        function Person(name){
         this.name = name;
        }
        var person1 = new Person("Pomy");
        var person2 = new Person("dwqs");
        Object.freeze(person1);
        Person.prototype.Hi = function(){
         console.log("Hi");
        };
        person1.Hi(); //"Hi";
        person2.Hi(); //"Hi";
        

        補充:

        Object.seal(obj):封印對象,此時obj的屬性變成只讀,不能添加、改變或刪除屬性(所有屬性都不可配置),其[[Extensible]]值為false,[[Configurable]]值為false。可以利用Object.isSealed(obj)來檢測obj是否被封印。
        這容易讓人歧義,一般說屬性,我們都很容易理解為其值。
        ,希望樓主稍微修改一下,讓人更加容易理解。
        https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/seal
        我更推薦的是倒過來理解
        Object.freeze 凍結(jié)對象,不能進行任何屬性和屬性值的增刪改。
        Object.seal 封閉對象,和Object.freeze相比,可以修改已存在屬性的值。

        聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        JavaScript面向?qū)ο缶?上部)

        JavaScript面向?qū)ο缶?上部):數(shù)據(jù)類型 在JavaScript中,數(shù)據(jù)類型分為兩類: 原始類型 保存一些簡單數(shù)據(jù),如true,5等。JavaScript共有5中原始類型: boolean:布爾,值為true或false number:數(shù)字,值為任何整型會浮點數(shù)值 string:字符串,值為由單引號或雙引號括出的單個字符或連續(xù)字
        推薦度:
        標簽: js java javascript
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲一区精品无码| gogo全球高清大胆亚洲| 国产亚洲综合一区柠檬导航| 特级一级毛片免费看| 午夜毛片不卡免费观看视频| 最新国产成人亚洲精品影院| 114一级毛片免费| 亚洲理论片中文字幕电影| 久久综合国产乱子伦精品免费 | 精品国产无限资源免费观看| 老司机亚洲精品影院| 四虎在线免费视频| 亚洲国产情侣一区二区三区| 成人在线免费看片| 亚洲日本一线产区和二线| 国产公开免费人成视频| 免费人成视频在线播放| 久久精品熟女亚洲av麻豆 | 亚洲成?Ⅴ人在线观看无码| 成人a毛片免费视频观看| 中文字幕不卡亚洲 | 精品免费久久久久久成人影院| 亚洲精品宾馆在线精品酒店| 波多野结衣中文一区二区免费 | 亚洲一区二区三区首页| 成人性生交大片免费看无遮挡| 亚洲av无码专区亚洲av不卡| 久久精品国产精品亚洲人人| 国产精品免费大片| 亚洲精品国产首次亮相| 亚洲精品成人在线| 99爱在线精品视频免费观看9| 亚洲综合久久1区2区3区| 国产日产成人免费视频在线观看| a高清免费毛片久久| 久久亚洲日韩精品一区二区三区| 性感美女视频免费网站午夜| 三上悠亚在线观看免费| 亚洲人成www在线播放| 国产偷国产偷亚洲高清日韩| 四虎1515hh永久久免费|