日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

【JavaScript基础系列】决定你的人生能走多远的,是基础。

發(fā)布時(shí)間:2024/10/12 javascript 100 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【JavaScript基础系列】决定你的人生能走多远的,是基础。 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

   javaScript門檻非常低,一點(diǎn)語法,一個(gè)dom,一個(gè)bom就可以使用它開發(fā)大部分js應(yīng)用,再加上現(xiàn)在層出不窮的框架極大的簡化抽象了javaScript的使用方式,但是我們始終不能忘記的一點(diǎn)是,決定上層建筑的,是經(jīng)濟(jì)基礎(chǔ)。 決定你的javaScript能走多遠(yuǎn)的,是基礎(chǔ)。所以我決定在我的博客開一個(gè)關(guān)于javaScript基礎(chǔ)系列。詳細(xì)得,解讀其中的基礎(chǔ),再次刨開它的心臟細(xì)細(xì)研究。與大家共勉。

第一篇 字符串一

   我們從字符串開始介紹。

  字符串(String) ?基礎(chǔ)概念:一串有意義的字符集合叫做字符串,在js中使用單引號(hào)‘string’ 或者雙引號(hào) "string"表示字符串。它是js五個(gè)基本類型之一,姑且可以認(rèn)為它是js基本類型中特性最多的,技巧最多的基本類型。其他的如Number、boolean、null、undefined,其使用方式,引用方法,概念都沒有字符串來得多。

  了解js中的字符串的使用原理

  一、字符串的表達(dá)形式。

    ① 通過字面表達(dá)式定義的字符串。

    ?1 var str = "這是一串字符串";?

    聲明了一個(gè)變量str ,給這個(gè)變量指定值字符串 “”;?

    ②通過js內(nèi)置的String構(gòu)造函數(shù),

1 /***************************** 2 通過構(gòu)造函數(shù)定義的字符串, 3 實(shí)際上可以叫做字符串對象, 4 在chorme中返回一個(gè)字符拆分的對象 5 */ 6 var str = new String("hello world"); 7 console.log(str);

  二、字符串與字符串對象(為什么普通字符串可以調(diào)用構(gòu)造函數(shù)的方法?)。

  通過字面表達(dá)式定義的字符串與通過js內(nèi)置的String構(gòu)造函數(shù)生成的字符串,它們在使用的時(shí)候,行為似乎是一致的,但是,在更正確的表達(dá)中,它們是不同的,通過字面表達(dá)式我們直接給變量賦予了一個(gè)字符串值,而通過構(gòu)造函數(shù),我們得到的是一個(gè)String對象。

  下圖是內(nèi)置的String構(gòu)造函數(shù)在chorme中返回一個(gè)字符拆分的對象:

  

  而字面量方式則是:

  

  通過對兩個(gè)方式的typeof對比,我們可以看到:

/*****************************通過構(gòu)造函數(shù)定義的字符串,實(shí)際上可以叫做字符串對象,在chorme中返回一個(gè)字符拆分的對象*/var str = new String("hello world"); console.log(str);  //上圖1/*****************************通過typeof檢查的字符串對象,返回了object*/var _type = typeof str;console.log(_type)  //object/*****************************不使用構(gòu)造函數(shù),直接賦值呢?它就是一個(gè)基本值,typeOf返回string*/var str1 = "hello world";console.log(str1); //上圖2var _type1 = typeof str1;console.log(_type1)  //string

?

它們是否相等?答案是不相等,

console.log(str === str1); //false


那么我可以這么簡單的理解:new操作符只會(huì)返回對象,new String()永遠(yuǎn)都是一個(gè)對象,而對象是不會(huì)和字符串相等的。

有一點(diǎn)經(jīng)驗(yàn)的同學(xué)應(yīng)該可以看出,這里如果使用==的話,str==str1,返回的是true。這是因?yàn)閖s中的類型轉(zhuǎn)換機(jī)制決定的,它隱式的調(diào)用了字符串對象的valueOf方法。我們可以做一個(gè)小實(shí)驗(yàn):

/***************************如果我重寫str的valueOf方法將它指向一個(gè)新的值*/console.log("before ",str == str1);//truestr.__proto__.valueOf = function(){return "javaScript!";}console.log("after ",str == str1);//false
       console.log(str+str1) //javaScript!hello world

我更改了str的原形對象中的valueOf方法,使它總是返回一個(gè)新字符值?"javaScript!",最后再和str1用==比對的時(shí)候,返回了false。

目前為止可以得出結(jié)論是,字符串和字符串對象不相等,甚至不是同一個(gè)概念,一個(gè)是基本類型值,一個(gè)是構(gòu)造函數(shù)生成的字符對象,但在js機(jī)制中,比較時(shí)隱式的使用了valueOf方法,調(diào)用拼接時(shí)也隱式調(diào)用了valueOf方法。

js以這種方式給字符串“繼承”了一些方法,能看到的做法是,js在使用字面表達(dá)式定義的字符串調(diào)用方法時(shí),悄悄的給它包了一層字符串對象的殼。

通過調(diào)用__proto__屬性就可以看出 //通過調(diào)用__proto__屬性就可以看出 console.log(str1.__proto__ === str.__proto__); //true 他們繼承的對象是相等的

字符串與字符串對象的使用方式一致,typeof得到的值不同,在使用字面表達(dá)式定義的字符串調(diào)用方法時(shí),js會(huì)隱式調(diào)用new String(),這就是為什么基礎(chǔ)類型能夠調(diào)用對象方法的原因。

通過這個(gè)理解方式,我們就不難理解為什么一個(gè)數(shù)字、一個(gè)字符串能調(diào)用內(nèi)置方法了。

 三、字符串下標(biāo)

  字符串是有下標(biāo)的。由于上面介紹的字符串與字符串對象的關(guān)系,任意字符串都可以通過下標(biāo)訪問到對應(yīng)的位置的單個(gè)字符。下圖在chorme中打印的一個(gè)字符串對象:

?

  可以看到一共11個(gè)字符從0到10,需要注意的是它并不是數(shù)組。而是一個(gè)屬性名為0-10的對象。

/*****************************可以通過下標(biāo)訪問字符串字符這里字符串對象和字符串同樣能使用下標(biāo)訪問,這是因?yàn)閖avascript編譯時(shí),會(huì)在適當(dāng)?shù)臅r(shí)候?qū)⒆址b成字符串對象,這樣一般的字符串就也可以調(diào)用String構(gòu)造函數(shù)的方法了*/console.log(str[0]); //hconsole.log(str1[0]); //h

我們可以, 通過for循環(huán)打印每一個(gè)字符,也可以,通過數(shù)組的方法借用將字符串轉(zhuǎn)換成數(shù)組:

Array.prototype.slice.call(str) //["h", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d"]

但是需要注意的是,如果你直接修改str[11] = "!"的話,只會(huì)在對象中新增了一個(gè)名為11的屬性,并不會(huì)修改到字符串本身的值。

str[11] = "!"; console.log(str.valueOf()) // hello world 修改失敗!

為什么js要這么干?將字符串存儲(chǔ)兩份,一份是一個(gè)一個(gè)的對象屬性字符集,另一份指向原始值,也就是上圖的?[[PrimitiveValue]].。

我覺得它們有一個(gè)先后關(guān)系,先生成一個(gè)一個(gè)的對象屬性,再由對象屬性的一個(gè)個(gè)字符拼接成?[[PrimitiveValue]];

?

單元總結(jié)

  真正的基礎(chǔ)是什么?我覺得是它的內(nèi)在原理,它的實(shí)現(xiàn)思路以及實(shí)現(xiàn)方式,所以文中并沒有給出更多的字符串操作方法,

  本章介紹了字符串調(diào)用方法的來歷,介紹了字符串下標(biāo)的原理。下一章講什么,待定,博主是一邊回顧基礎(chǔ),一邊理解,一邊寫博客,當(dāng)然也有很多不正確的地方,感謝大家包容,更感謝大家指正。

  最后

  ==============================================================================================

  一首詩

  我想寫一首詩,

  歌頌風(fēng),

  頌唱雨。

  只是,

  我的桌子上沒有一支筆,

  詩沒有筆可能代表著,

  也許遠(yuǎn)方不那么遠(yuǎn),

  它就在筆上飛揚(yáng)。

  ================================================================================================

  轉(zhuǎn)載請注明出處。 9月12日劃水的下午

?

  

  

?

轉(zhuǎn)載于:https://www.cnblogs.com/ztfjs/p/easy_js.html

總結(jié)

以上是生活随笔為你收集整理的【JavaScript基础系列】决定你的人生能走多远的,是基础。的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。