2019年1月20日 星期日

【Ch7陣列】reverse & sort & concat

▌reverse

  • 反轉原陣列
var a=[1,2,3]
console.log(a.reverse())   // [3,2,1]

▌sort

  • 排序原陣列,如果不用引數,就用abc順序來排序
var a=["c","v","a"]
console.log(a.sort())

▌concat

  • 結合兩個陣列,並回傳一個新的陣列
var a=["a","b","c"]
var b=[1,2,3]
c=a.concat(b)
console.log(c)

【Ch7陣列】陣列的增加刪除 push & pop / shift & unshift / join & spilt


▌push & pop :後面

  • push:在原陣列最後面加上一個元素
  • pop:刪除最後面的陣列元素
var a= [1,2,3,4]
a.push(5)  // [1,2,3,4,5]
a.pop()  //  [1,2,3,4]

▌ shift() & unshift() :前面

  • shift() :把第一個元素刪掉,並且回傳該元素
  • unshift():把元素塞到第一個前面
var a= [1,2,3,4,5];
a.shift() // a= [2,3,4,5]

var a= [1,2,3,4,5];
a.unshift(2)
console.log(a) // [2,1,2,3,4,5]

▌ join() & spilt()

join() :把元素轉成字串,然後回傳
var a= [1,2,3,4]
var b=a.join(",")   // 1,2,3,4
spilt():把字串切成元素,然後回傳陣列
var a= "abcd";
var b=a.split("");
console.log(b);

【Ch7陣列】什麼是陣列(Array)? 查詢 in / indexOf


  • 陣列是一組有續集群,裡面有元素(element)索引(index)
  • 是一種特殊的物件,Zero based 從0開始最大到2^32-2
  • 元素不具型別,可以是任何型別。

▌陣列的特殊性

  • 稀疏性:可以不需要擁有連續的索引index
  • length:比元素還要多,可以根據需求自動擴充
  • 索引可以不是數字(因為array是特殊的物件),索引如果不是數字會被轉成字串,當成特性property 去查詢這個陣列物件。
Var a=[,,]沒有元素但是會得出length=2(因為可以尾隨逗點)
Var a = new array()
Var a =new array(10) /指定元素的數量,但是此時還沒有index
console.log(a.length); //10
console.log(a[0]); //undefined

▌查詢

  • instanceof Array:陣列跟物件用typeof分不出來,必須用instanceof Array查
var a = [1,2,3]
console.log(typeof a)  // object
console.log(a instanceof Array)  // trye
  • X in array:可以查詢索引(也就是物件的特性)
var a= [1,2,3,5]
console.log(3 in a)   //true
  • indexOf():從前面開始找,然後回傳索引
var a = [1,2,3,4,5]
console.log(a.indexOf(1))  //0
  • lastindexof():從後面開始找,然後回傳索引

2019年1月19日 星期六

【Ch8函式】間接調用 call()、apply()、bind()


▌間接調用
  • call():把函式用在不同物件
  • apply():把函式用在不同物件(差別在於用陣列傳參數)
  • bind():把函式「綁在」不同物件
var person={
  name:"neo",
  age:12
}

var person2={
  name:"nissen",
  age:21
}

function show(){
  console.log(this.name+" is "+this.age);
}

show.call(person)  //neo is 12
show.call(person2)  //nissen is 21
console.log(show.bind(person)) //[Function: bound show]
上面有兩個物件,如果想要讓show()可以用在兩個物件上就可以使用call或是ㄇapply,但是如果想要綁在上面就可以用bind()

【Ch8函式】this & closure & 巢狀函式(nested)


▌this

  • this可以的調用外層物件的變數,但是不可以調用超過一層的物件。如果需要,必須用self來調用。
var obj={
 name:"neo",
 outer:function(){
   var self=this;
   function inner(){
     console.log(self.name);
   }
   inner();
 },
};

obj.outer();  // neo
  • this是一種keyword,但不是變數

▌封包(closure)

  • JS函式執行的scope chain用的是在他們定義時生效的chain
  • 雖然inner被執行的時候checkscope()已經消失了,可是當inner()被定義的時候,他就是接收了local scope,因此扔然會輸出local scope
var scope="global scope";
function checkscope(){
  var scope="local scope";
  function inner(){
    return scope;
  }
  return inner;
}

console.log(checkscope()()); //local scope

▌巢狀函式(nested)

內部的函式可以存取外部的參數和變數(再多層也可以)
function outer(){
  var a=12;
  function inner(){
    function very_inner(){
      console.log(a)
    }
    very_inner();
  }
  inner();
}
outer();
// 會回傳12

【Ch8函式】函式宣告述句 & 函式定義運算式 &匿名函式


▌函式宣告(declaration)述句

  • 宣告(declaration)變數,再把函式再指定給它
  • 會有拉升的情況(但我不懂是三小)
var age=function(){
  console.log("20");
}

▌函式定義運算式

  • 並沒有先宣告變數(但還是使用掉了name的變數)
function name(){
  console.log("neo")
}

▌匿名函式

  • 以上兩者都會佔用變數,如果不想污染全域變數,就可以使用匿名函式
(function(){console.log("hi")})()

【Ch8函式】函式是什麼:參數(Parameter)& 引數(argument)和 Return


  • 函式是一種物件,擁有參數(Parameter)跟引數(argument)。有些函數透過引數會產生回傳值(return value)
  • 函式可以被指定爲物件的特性(property),此時稱為方法

▌參數(Parameter)& 引數(argument)

  • parameter就是那個x,y不是實際的值;argument是實際傳入的值
  • argument是一個物件,會存放傳入的數值
function add(x,y){
  console.log(arguments)
  console.log(arguments.length)
}
add(2,3)
// [Arguments] { '0': 2, '1': 3 }
// 2
//實作取MAX值
function max(){
 for(i=0;i<arguments.length;i++){
   var max=Number.NEGATIVE_INFINITY;  // 最大負值
   if (arguments[i]> max) max=arguments[i] 
 }
 return max
}
console.log(max(2,3,1000)) //1000

▌Return

  • 當運算停止時,return會將運算的值return給互叫者(Caller),如果相應的運算值結果,就會return undefined。
  • return也可以回傳函式
var scope="global scope";
function checkscope(){
  var scope="local scope";
  function inner(){
    return scope;
  }
  return inner;
}

▌函式宣告述句:先定義函式,再指派給變數

var a = function(){
....
}

▌函式定義運算式

function a () { .... }

【JavaScript】用物件Mapping的方法

If的寫法 我們希望當變數是a時就回傳1,變數是b就回傳2,變數是c就會回傳3,一般寫法就是用if,但是這樣會很冗 ​ // IF style var word if(word == 'a'){ word = 1 } else if...