深挖JS語法第一集

從今天開始用從新認識JS,畢竟前端是靠JS吃飯的,開始深挖一下細節,在這個過程當中也反思了一下,爲啥java沒學好。果真是基礎不牢,地動山搖啊,古人誠不欺我也!前端

JS的數據類型有哪幾種?

之前一直說會JS,卻連這個問題沒好好搞過,給本身兩耳光……java

數據類型 名稱
1. 基本數據類型(也叫簡單數據類型) number string boolean symbol undefined null
2. 複雜數據類型 object
  • 注意,array和function屬於object類型;symbol是ES6的內容。

幾個大坑

  • 長字符串裏面的大坑 長字符串能夠用+鏈接符,優雅易懂。可是還能夠這麼寫
var longStr = 'agggggg\ bgggggg\ cgggggg\ d'
//結果依然是aggggggbggggggcggggggd
複製代碼

上述代碼不報錯的前提是\後面不能有除了換行符之外的任何字符,即便一個空格就報錯 數組

長字符串的坑.png

  • 字符串的length屬性和字符集
    • 字符串的length***屬性***是不可更改的,你愛寫啥寫啥,length屬性不變。
      length屬性.png

java的8個基本數據類型:byte short int long float double char boolean java裏面的判斷長度的方法只有三個bash

  • 字符串的length屬性
  • 數組的length()方法
  • 集合類的size()方法

  • 字符串的字符集

因爲JavaScript引擎(嚴格說是ES5規格)不能自動識別輔助平面(編號大於0xFFFF)的Unicode字符,致使全部字符串處理函數遇到這類字符,都會產生錯誤的結果(詳見《標準庫》一章的String對象章節)。若是要完成字符串相關操做,就必須判斷字符是否落在0xD800到0xDFFF這個區間。 替換(String.prototype.replace)、截取子字符串(String.prototype.substring, String.prototype.slice)等其餘字符串操做,都必須作相似的處理。ide

代碼以下函數

function getSymbols(string) {
  var length = string.length;
  var index = -1;
  var output = [];
  var character;
  var charCode;
  while (++index < length) {
    character = string.charAt(index);
    charCode = character.charCodeAt(0);
    if (charCode >= 0xD800 && charCode <= 0xDBFF) {
      output.push(character + string.charAt(++index));
    } else {
      output.push(character);
    }
  }
  return output;
}

var symbols = getSymbols('𝌆');

symbols.forEach(function(symbol) {
  // ...
});
複製代碼
  • JavaScript原生提供兩個Base64相關方法。

Base64是一種基於64個可打印字符來表示二進制數據的表示方法。因爲2的6次方等於64,因此每6個比特爲一個單元,對應某個可打印字符。三個字節有24個比特,對應於4個Base64單元,即3個字節可表示4個可打印字符。它可用來做爲電子郵件的傳輸編碼。在Base64中的可打印字符包括字母A-Z、a-z、數字0-9,這樣共有62個字符,此外兩個可打印符號在不一樣的系統中而不一樣。ui

兩個方法 btoa():字符串或二進制值轉爲Base64編碼 atob():Base64編碼轉爲原來的編碼編碼

var string = 'Hello World!';
btoa(string) // "SGVsbG8gV29ybGQh"
atob('SGVsbG8gV29ybGQh') // "Hello World!"
複製代碼

這兩個方法不適合非ASCII碼的字符,會報錯。spa

btoa('你好')
VM1195:1 Uncaught DOMException: Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.
    at <anonymous>:1:1
複製代碼

要將非ASCII碼字符轉爲Base64編碼,必須中間插入一個轉碼環節,再使用這兩個方法prototype

function b64Encode(str) {
  return btoa(encodeURIComponent(str));
}

function b64Decode(str) {
  return decodeURIComponent(atob(str));
}

b64Encode('你好') // "JUU0JUJEJUEwJUU1JUE1JUJE"
b64Decode('JUU0JUJEJUEwJUU1JUE1JUJE') // "你好"
複製代碼
兩個角度來看待 緣由
1. 語法規範 變量沒有值,就是undefined。事實上,你在console上隨便寫一個語句,都是undefined
2. 習慣上理解 若是有一個對象,你聲明瞭,可是此時不給他賦值,讓他等於null;若是你有一個非對象的變量,你此時不想賦值,就讓他等於undefined。

var obj = null,別人一眼就能看出你是想聲明一個對象,不過此時不想賦值;var a = undefinded,別人一眼就能看出你是想聲明一個非對象,此時不想賦值

  • 對象的key的問題 對象就是一組「鍵值對」(key-value)的集合,是一種無序的複合數據集合。 你用for...in的時候那個順序的***隨機的*** 大坑來啦……以下代碼
var obj = {
   'name': 'wushao', 
   'age': 8}
for (var key in obj){
    console.log(obj.key)
}
複製代碼

你是想打印出'wushao'和8來,結果屁都沒有。

key的陷阱.png

  • 注意 [ ]運算符裏面***必須是字符串,並且是對象的鍵***。這個例子中,key纔是字符串,並且是obj的key;你obj.key至關於obj['key'],obj沒有這個叫key的鍵。 對象的基本結構式{key: value} key必須是字符串,valu是那7種 的任意一個。
var obj = {
  ' ': 'frank'
  沒問題
}
複製代碼
  • 關於key加不加引號的問題。 你保證你的key符合標識符規範,能夠不加,可是有個默認的引號在上面。若是不符合標識符規範的,必須加引號 同理,obj[ ]括號裏面不符合標識符規範的,必須加引號。
var person = {
  '09a': '我不符合標識符規範,key必須加引號保護,不然就報錯',
  name: '我符合標識符規範,引號加不加均可以,反正key必定是個字符串'
}
複製代碼

key的寫法.png

-還有啊,對象的每一個key-value的結束,必定記得加逗號啊!!!!,能多寫不能少寫,最新的ES6能夠都寫逗號,不報錯

總之,記住一個公式

obj.name 等同於 obj.['name']

  • 判斷某個屬性是否聲明過 用下面的公式
if ('a' in window) {
  // 變量 a 聲明過
} else {
  // 變量 a 未聲明
}
複製代碼
相關文章
相關標籤/搜索