210405javascript

//弱類型特性

數(shù)據(jù)類型
原始類型:number string boolean null undefined
對象類型:object

隱式轉(zhuǎn)換

巧用+,-

javascript是一種運行在瀏覽器中的解釋型編程語言
web世界里,只有js能跨平臺,跨瀏覽器驅(qū)動網(wǎng)頁,與用戶交互。
新興的nodejs把js引入到服務(wù)器端。

<script type="text/javascript">
  //type的默認(rèn)值是javascript
</script>

運行JavaScript方式:
必須有一個HTML頁面,在HTML頁面中引入JavaScript,讓瀏覽器加載HTML頁面,就可以執(zhí)行JavaScript代碼。
特別的:
直接打開新建的包含JavaScript的html頁面有時候會有問題,由于瀏覽器的安全限制,以‘file://’開頭的地址無法執(zhí)行如聯(lián)網(wǎng)等JavaScript代碼,還需要架設(shè)一個web服務(wù)器,以‘http://’開頭的地址正常執(zhí)行所有代碼。

目前最主流的三個Web服務(wù)器是Apache、 Nginx 、IIS。

javascript區(qū)分大小寫

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

1.Number
以下都是合法的Number類型
123;0.256;1.235;-99;NaN;Infinity;

2.字符串
1.以單引號和雙引號括起來的任意文本,雙引號和單引號是一種表示方式,不是字符串的一部分。例如‘a(chǎn)bc’只有‘a(chǎn)’,'b','c'這3個字符。
2.字符串中包含引號時候,用轉(zhuǎn)義字符\轉(zhuǎn)義即可
3.多行字符串使用反引號 ``(反引號在鍵盤的ESC下方,數(shù)字鍵1的左邊)
4.模板字符串
多行字符串拼接包含變量時 var message = 你好, ${name}, 你今年${age}歲了!;
5.字符串是不可變的,若對字符串的某個索引賦值,不會有報錯也沒效果,字符串的一些方法不會改變原有字符串的內(nèi)容而是返回一個新字符串

var s = 'Hello';
var lower = s.toLowerCase();// hello  轉(zhuǎn)小寫
var upper = s.toUpperCas();//HELLO 轉(zhuǎn)大寫
s.indexOf('o');// 4  搜索指定字符串出現(xiàn)的位置 索引從0開始
s.substring(0,2)//He  從0開始到2,不包含2
s.substring(0)//Hello從0開始到最后

3.布爾值
只有true false兩種值
相等運算符有兩種:

  1. == 自動轉(zhuǎn)換數(shù)據(jù)類型再比較,會得到詭異的結(jié)果
  2. === 不會自動轉(zhuǎn)換數(shù)據(jù)類型,類型不一致,返回false,類型一致,再比較。
NaN === NaN // false NaN和任何值都不相等
isNaN(NaN)//true 只能通過isNaN()這種方式判斷
1/3 === (1 - 2/3); //false 浮點數(shù)運算過程中會產(chǎn)生誤差,因為計算機無法精確表示無限循環(huán)小數(shù)。
//若比較兩個浮點數(shù),只能計算他們之差的絕對值是否小于某個閾值
Math.abs(1/3 - (1 - 2/3)) < 0.0000001//true

4.null和undefined
null表示一個‘空’的值,表示‘空’
0:是一個數(shù)值
‘’:長度為0的字符串
undefined:表示未定義,僅僅在判斷函數(shù)參數(shù)是否傳遞的情況下有用

5數(shù)組
是一組按順序排列的集合,集合的每個值稱為元素。數(shù)組可以包括任意數(shù)據(jù)類型

//slice()對應(yīng)字符串中的substring()方法,截取數(shù)組中的元素
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
arr.slice(0,3)// 從0開始,到3結(jié)束,不包括3,返回['A', 'B', 'C']
//splice()修改數(shù)組的萬能方法,從指定索引開始刪除若干元素,從該位置添加若干元素
var arr = ['Microsoft', 'Apple', 'Yahoo', 'AOL', 'Excite', 'Oracle'];
arr.splice(2,3,'newadd1')// 從索引2開始刪除3個元素,在索引2處添加newadd1  返回['Yahoo', 'AOL', 'Excite']
arr//['Microsoft', 'Apple', 'newadd1', 'Oracle'];

6對象
是一組由鍵值組成的無序集合,鍵都是字符串類型,值可以是任意類型。例如下面
var person= {
name:'aa',
age:20,
tags:['js','web'],
zipcode:null
}
要過濾掉對象繼承的屬性,用hasOwnProperty()來實現(xiàn):

var o = {
    name: 'Jack',
    age: 20,
    city: 'Beijing'
};
for (var key in o) {
    if (o.hasOwnProperty(key)) {
        console.log(key); // 'name', 'age', 'city'
    }
}

es6中心的數(shù)據(jù)類型Map,是為了解決對象中鍵必須是字符串,數(shù)字和其他類型不能做為鍵的問題。
Map是一組鍵值對的結(jié)構(gòu),具有極快的查找速度。
初始化Map需要一個二位數(shù)字,或者直接初始化一個空的Map
Set是一組key的集合,不存value,由于key不能重復(fù),故set中沒有重復(fù)的key,需要提供一個array作為輸入,或者創(chuàng)建一個空的set

//查找某個同學(xué)的成績,先找到名字,再根據(jù)名字位置找到分?jǐn)?shù),數(shù)組越大耗時越長
var names = ['Michael', 'Bob', 'Tracy'];
var scores = [95, 96, 97];
//map實現(xiàn)方式
var m = new Map([['Michael',95],['Bob',96],['Tracy',97],]);
m.get('Michael')//95
console.log(m)//{"Michael" => 95, "Bob" => 96, "Tracy" => 97}
//map的方法
var m = new Map();
m.set('aa',67)//添加值
console.log(m)//{"aa" => 67}
m.has('aa')//是否存在  true
m.get('aa')// 獲取值 67
m.delete('aa')//刪除 aa
var s = new Set([1, 2, 3, 3, '3']);
s; // Set {1, 2, 3, "3"} 重復(fù)元素在set中自動過濾
s.add(4)//添加元素
s.delete(4)//刪除元素

遍歷map和set的方法是 for(var x of map),更好的方式是iterable的內(nèi)置forEach方法,接收一個函數(shù),每次迭代自動回調(diào)該函數(shù)

//for in循環(huán)的歷史遺留問題:會把自定義添加的屬性遍歷出,但length屬性卻不包括在內(nèi)。
var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x in a) {
    console.log(x); // '0', '1', '2', 'name'
}
a.forEach(function (element, index, array) {
    // element: 指向當(dāng)前元素的值
    // index: 指向當(dāng)前索引
    // array: 指向Array對象本身
    console.log(element + ', index = ' + index);
});

變量
命名規(guī)則:英文字母,數(shù)字,$,_,不可數(shù)字開頭,不可包含關(guān)鍵字(if,while)
賦值 :x = x + 2,先執(zhí)行x+2 再執(zhí)行賦值
strict模式 :強制通過var申明變量,未使用var申明變量就使用的,將導(dǎo)致運行錯誤。
啟用strict模式的方法是在JavaScript代碼的第一行寫上 'use strict';

函數(shù)體內(nèi)部的語句在執(zhí)行時,一旦遇到return時,函數(shù)執(zhí)行完畢,并將結(jié)果返回。若沒有return語句,執(zhí)行完也會返回結(jié)果,只是結(jié)果是undefined。return返回多行結(jié)果時,js引擎在行末自動添加分號機制,會有個坑

//錯誤寫法
function foo() {
    return; // 自動添加了分號,相當(dāng)于return undefined;
        { name: 'foo' }; // 這行語句已經(jīng)沒法執(zhí)行到了
}
//正確寫法
function foo() {
    return{ // 這里不會自動加分號
        name: 'foo' 
      }; 
}

函數(shù)傳參:由于可以傳任意個參數(shù)即使用不到,所以取所有的參數(shù)的方法 rest參數(shù)只能寫在最后,前面用...標(biāo)識

function foo(a,b,...rest){
  console.log(a);
  console.log(b);
  console.log(rest);
}

foo(1,2,3,4,5)
//a=1
// b=2 
//[3,4,5]

解構(gòu)賦值:可以同時對一組變量進(jìn)行賦值
對象結(jié)構(gòu)賦值:保證對應(yīng)層次一制

var [x, y, z] = ['hello', 'javascript', 'es6'];
console.log(x)//hello
let [,, z] = ['hello', 'javascript', 'es6']
console.log(z)//es6  前面參數(shù)可以忽略
let person = {
  name:'tt',
  age:20,
  address: {
    city:'beijing',
    street:'No.1 road'
  }
}
var {name, address:{city,street}} = person
console.log(city)//beijing  address不是變量,只是為了讓city獲得嵌套的屬性
var {name,age:id} = person
console.log(id)// 20  age不是變量,為了讓id獲得age的屬性
console.log(age) //  Uncaught ReferenceError: age is not defined
//給對象新添加一個帶默認(rèn)值的屬性
var {name, single = true} = person;
console.log(single)//true
//給對象已有的變量再次賦值
// 聲明變量:
var x, y;
// 解構(gòu)賦值:
({x, y} = { name: '小明', x: 100, y: 200})

apply()改變this指向,兩個參數(shù),
第一個是需要綁定的this變量,
第二個是array,表示函數(shù)本身的參數(shù)

function getAge() {
    var y = new Date().getFullYear();
    return y - this.birth;
}

var xiaoming = {
    name: '小明',
    birth: 1990,
    age: getAge
};

xiaoming.age(); // 25
getAge.apply(xiaoming, []); // 25, this指向xiaoming, 參數(shù)為空

call() 與apply()區(qū)別,傳參數(shù)一個一個傳

Math.max.apply(null, [3, 5, 4]); // 5
Math.max.call(null, 3, 5, 4); // 5
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容