javascript
原生JS零魂之问(上)学习笔记
作為一個普通的JS初學者,從神三元大佬的知識梳理文章中受益匪淺,寫下我的學習筆記吧。
JS數據類型
function test(person) {person.age = 26person = {name: 'hzj',age: 18}return person}const p1 = {name: 'fyq',age: 19}const p2 = test(p1)console.log(p1) // { name: 'fyq', age: 26 }console.log(p2) // { name: 'hzj', age: 18 }test函數中的實參person是p1對象在堆中內存地址的copy,調用person.age = 26改變了p1的值,但隨后person又被重寫覆蓋了,變成了另一塊內存空間的地址,并且在最后將這另外一份內存空間的地址返回,賦給了p2。
研究一下?前五個貌似是對象,因為他們擁有方法,但他們是不可變的?
數字、字符串、布爾值并不是對象,但是它們卻擁有屬性和方法。這是因為在引用它們的屬性和方法時會分別通過調用new Number()、new String()、new Boolean()包裝對象來轉換成對象,該對象繼承了對應的方法來處理屬性的引用,一旦引用結束,便會銷毀這個臨時對象。null和undefined沒有包裝對象,訪問它們的屬性會報類型錯誤。
console.log(typeof 1); //numberconsole.log(typeof new Number(1)); //object1 === new Number(1) //fasle這里把1包裝成一個對象,這就是原始類型和包裝對象的區別。
let x = 32;console.log(x.toString(2)); //100000// 創建object實例 調用實例方法 銷毀實例方法和屬性也可用于原始值,因為JS在執行方法和屬性時將原始值視作對象。簡單數據類型不能添加屬性,但是除了null和undefined,其他的都可以訪問屬性,所以他們擁有對象的特征,但其實還是簡單數據類型而非對象。
JS精度損失
console.log(0.1 + 0.2); // 0.30000000000000004JS不分整型和浮點型,兩個浮點數相加,轉換成二進制后會無限循環,由于標準位數的限制后面多余的位數會被截掉導致精度損失。
BigInt
在JS中,所有的數字都以雙精度64位浮點格式表示,這導致JS中的Number無法精確表示非常大的整數,它會將非常大的整數四舍五入,JS中的Number類型只能安全地表示-9007199254740991(-(2^53-1))和9007199254740991((2^53-1)),任何超出此范圍的整數值都可能失去精度。
const theBiggestInt = 9007199254740991nconsole.log(theBiggestInt, typeof theBiggestInt); // 9007199254740991n 'bigint'console.log(theBiggestInt + 1n); // 9007199254740992nconsole.log(theBiggestInt * 10n); // 90071992547409910nJS類型裝換
===叫做嚴格相等,是指:左右兩邊不僅值要相等,類型也要相等 叫做嚴格相等。==不像===那樣嚴格,對于一般情況,只要值相等,就返回true,但==還涉及一些類型轉換。
對象轉原始類型
// 優先調用toPrimitive,最后調用toStringvar obj = {value: 3,valueOf() {return 4;},toString() {return '5'},[Symbol.toPrimitive]() {return 6}}console.log(obj + 1); // 輸出7閉包
- 函數內部嵌套函數 包含被引用變量(函數)的對象。
閉包產生的本質就是,當前環境中存在指向父級作用域的引用。
調用f1()給f3()賦值,此時f3()擁有window、f1和f3本身這幾個作用域的訪問權限,變量f3存在著父級作用域的引用,因此產生了閉包。
JS實現繼承
function Parent () {this.name = 'parent';this.play = [1, 2, 3];}function Child() {Parent.call(this);this.type = 'child';}Child.prototype = Object.create(Parent.prototype);Child.prototype.constructor = Child;面向組合繼承
面向組合就是先設計一系列零件,然后將這些零件進行拼裝,來形成不同的實例或者類。代碼干凈,復用性也很好。這就是面向組合的設計方式。
function drive(){console.log("wuwuwu!"); } function music(){console.log("lalala!") } function addOil(){console.log("哦喲!") }let car = compose(drive, music, addOil); let newEnergyCar = compose(drive, music);附上原文鏈接:( 建議收藏 )原生JS靈魂之問, 請問你能接得住幾個?(上)
總結
以上是生活随笔為你收集整理的原生JS零魂之问(上)学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS Code, VS 2022 使用正
- 下一篇: html点击图片弹出模态框,JS实现图片