Open zuppachu opened 6 years ago
一段腦衰與崩潰的故事。
故事是這樣的。這教學影片我看了三遍,但是有看還是沒看懂。突然想到老師之前說過:「搞不懂時,就把自己當電腦一樣,一行一行寫出來。」嗯,寫出來以後,我請老師過目~
一段腦衰與崩潰的故事就此展開😂
以下為原始題目:
function transform(arr,transformFunction) {
var result = []
for(var i =0; i < arr.length; i++) {
result.push(transformFunction(arr[i]))
}
return result
}
function double(x) {
return x*2
}
console.log(transform([1,2,3],double))
看不懂怎麼解嗎? 沒關係。
先從最簡單的地方開始。
var result = []
result.push(0)
return result
result? [0]
var arr = [1, 2, 3]
console.log(arr[0])
會印出什麼? [1]
接著再來看
var result = []
var arr = [1, 2, 3]
result.push(arr[0])
return result
result 會是什麼? [1]
再看下去
function double(x) {
return x*2
}
var arr = [1, 2, 3]
var result = []
result.push(double(arr[0]))
return result
result 會是什麼? [2]
再接著看下去。
function transform(arr,transformFunction) {
var result = []
result.push(transformFunction(arr[0]))
return result
}
function double(x) {
return x*2
}
console.log(transform([1,2,3],double))
result 會是什麼? [2]
紀錄一下跑程式(上圖)的過程:
=> arr[0] = 數字 1,所以
result.push(transformFunction(arr[0])) = result.push(transformFunction(1))
=> transformFunction(1) = dobule(x)
=> 跑 function double(x) // x = 1
=> return x*2 => 1*2 = 2
以下為簡易圖示
數字: [1,2,3]
位置: 0,1,2
transformFunction(1) = double(x)
最後一個很重要,for loop 跑程式的方式如下:
題目再看一次,方便比較。
function transform(arr,transformFunction) {
var result = []
for(var i =0; i < arr.length; i++) {
result.push(transformFunction(arr[i]))
}
return result
}
function double(x) {
return x*2
}
console.log(transform([1,2,3],double))
匿名函式寫法:
function transform(arr,transformFunction) {
var result = []
for(var i =0; i < arr.length; i++) {
result.push(transformFunction(arr[i]))
}
return result
}
console.log(transform([1,2,3], function(x) {
return x*2
}
))
以下為上題程式跑法,有錯歡迎指正,感謝你~
(transform(1,2,3),double) 帶入 function transform
先跑 for loop
=> i = 0 => arr[0] => 0<3 (true) => result.push(transformFunction(arr[0]) => i=0+1 =1
=> i = 1 => arr[1] => 0<3 (true) => result.push(transformFunction(arr[1]) => i=1+1 =2
=> i = 2 => arr[2] => 0<3 (true) => result.push(transformFunction(arr[2]) => i=2+1 =3
=> i = 3 => arr[3] => 陣列內沒有3的位置 => (false) = stop
=> result.push(transformFunction(arr[0]) => result.push(transformFunction(1)) => transformFunction(1)=double(x) => 跑 function double(x) => x*2 = 1*2 => return result = [2]
=> result.push(transformFunction(arr[1]) => result.push(transformFunction(2)) => transformFunction(2)=double(x) => 跑 function double(x) => x*2 = 2*2 => return result = [4]
=> result.push(transformFunction(arr[2]) => result.push(transformFunction(3)) => transformFunction(3)=double(x) => 跑 function double(x) => x*2 = 3*2 => return result = [6]
result = [2,4,6]
呼~終於打完了!一整天就弄一個題目也是夠了 😂
首先, Function 的結構:
function 名稱(參數){
內容
}
- 一個 function 也可以沒有返回值(return),亦即省略 return 語句,預設會返回 undefined
- return 後面記得要加東西,不然也會返回 undefined (影片處約 7:30)
宣告一個函式並不會執行它,要使用『呼叫函式』的語法(calling function),促使函式執行。
function addValue(a,b) {
return a+b //回傳不會顯示出來,要用 console.log() 測試程式才會。
}
addValue(1,3) //呼叫函式的語法底加!
console.log(addValue(1,3)) //得4
Function 裡面可以放什麼?
//想要在陣列裡面產生 1~10
function generateArray(n) {
var result = []
for (var i = 0; i <= n; i++){
result.push(i)
}
return result
}
console.log(generateArray(10))
//得 [1...,10]
//想要在陣列裡面數 3~10
function generateArray(From, To) {
var result = []
for (var i = From; i <= To; i++){
result.push(i)
}
return result
}
console.log(generateArray(3,10))
// 得 [ 3, 4, 5, 6, 7, 8, 9, 10 ]
- 放 function:
```javascript
function transform(x, transformFunction) {
return transformFunction(x) // function 裡面也可以放 function
}
function test(x) {
return x*2
}
console.log(transform(10,test)) //20
function hello() {
console.log('hello')
}
//function 也是一種資料型態
var hello = function() { console.log('hello') } //這函式是無名稱的,以變數為主。
3. 有點多此一舉的函式,但是還是列一下,怕以後沒看懂
```javascript
function transform(x, transformFunction) {
return transformFunction(x)
}
function test(x) {
return x*2
}
console.log(transform(10,test)) // 20
consoole.log(test(10)) //與上面寫法一樣答案,上面寫法就是多此一舉XD
例三還有另外一個例子,可看這邊。
console.log(
transform([1,2,3]), function(x) {
return x*3
})
[MTR01] Lesson1-2 JS基礎 (52:30處)
作用域代表一個變數的生存範圍 = 超過這個生存範圍,此變數就不存在了。
作用域分為:
以下例子為 function scope 無法再 global scope 中顯示:
function test() {
var a = 1;
}
console.log(a) //undefined
//undefined 是因為 a 只能生存在 funciton test() 裡,而且此 log(a) 超出 function 的範圍,表示不存在。
變數在不同 scope 裡的生存範圍:
var a = 10; //全域變數
function test() {
var a = 1; //函式域變數
console.log(a) //prints 1
}
test();
console.log(a) //prints 10
宣告變數時一定要加 var,否則 JavaScript 會把此變數自動改成全域變數,容易產生 bug :
var a = 1; //全域變數
function test() {
a = 10; //自動變成全域變數,重新把 a 設成 10
console.log(a) //prints 1
}
test();
console.log(a) //prints 10
什麼叫做引數? 引數就是真正傳進去的東西,如例子:
function add(a,b) { // a,b 為參數
return a+b
}
add(3,5) //引數為 3與5
在 javaScript 裡面有個很特別的東西是,只要將 Arguments 用 console.log() 出來,就會顯示出他的引數:
function add(a,b) {
console.log(arguments) // {'0': 2, '1': 5}
return a+b // 得7
}
add(3,5)
以下寫法,答案與上面寫法一樣: (但很少用到)
function add() {
return arguments[0] + arguments[1] // 得7
}
add(3,5)
{}
非 []
,代表它其實是個物件,一個長得很像 array 的物件(類陣列,array-like)。那如何判斷呢?
function add(a,b) {
console.log(Array.isArray(arguments)) // 得 false
return a+b
}
consloe.log(add(2,5))
引數也可以用 .length
function add(a,b) {
console.log(arguments.length) // 得 2, 兩個數
return a+b
}
consloe.log(add(2,5))
有三種類型:
更深入,請點這(還沒看XD)
var number1 = 10
var number2 = 20
function swap(a,b) { //想像 a = number1 , b = number2 var temp = a a = b b = temp console.log('a: ', a ,"b: ", b) }
console.log(number1, number2) swap(number1, number2) console.log(number1, number2) // 10 20 // a: 20 b:10 //10 20 (值並無改變)
- **物件和陣列,皆指向『同一個』『記憶體位置』,所以裡面有可能會改到外面的東西(如用 .a 的時候)**
```javascript
function addValue(obj) {
obj.number++ //因為他們指向同一個物件,所以裡面的 obj 可以改到外面的 var a = {number: 10}
return 1
}
var a = {
number: 10
}
addValue(a)
conslole.log(a) // 得 number: 11
再一題:
function addValue(obj) {
obj = {
number: 100
}
return 1
}
var a = {
number: 10
}
addValue(a)
conslole.log(a) // 得 number: 10
原因:因為用指定新的變數,儲存的記憶體位置不同了!
return 有兩種:
function sayHello() {
console.log('hello')
// 這邊沒寫 return 沒關係,因為在函式裡面,它會自動預設回傳值(return)為 undefined
}
sayHello() // 得 hello
2. 需要知道結果的,則需寫 return
```javascript
function dbouble(x) {
return x * 2
}
double(3) // 結果:空白
因為沒寫 console.log(double),所以無法顯示結果。
function dbouble(x) { return x * 2 } var result = double(3) console.log(result) // 得 6
備註:
必須注意一 return 就會跳回去 = 忽略下面的程式碼。
共有以下四種類型:Number 、Math、String、Array。
Number():轉換整個值,非部分的值
parseInt(n, 幾進位):轉成整數
parseFloat():轉成浮點數 (可看補充)
var a = 10
var b = "20.123"
//可用 Number(b) 將字串變成數字
console.log(a + Number(b))
// 得 30.123
//或是用 parseInt(b,10) 將字串變成數字,10 表示 10 進位
console.log(a + parseInt(b,10))
// 得 30
var a = 10
var b = "20.3554735"
//字串變小數
console.log(a + parseFloat(b))
//取小數後兩位,會四捨五入
console.log(parseFloat(b).toFixed(2))
//沒寫會取整數
console.log(parseFloat(b).toFixed())
// parseFloat().toFixed() 結果輸出是字串,因為數字+字串
console.log(a + parseFloat(b).toFixed(2))
// 得 30.3554735
// 得 20.36
// 得 20
// 得 '1020.36'
var x = 123
x.toString() //將變數x轉為字串"123"。
(123).toString() //將數字123轉為字串"123"。 (100 + 23).toString() //將表達式100+23計算後轉為字串"123"。
2. String():強制轉換為 string - 可用於任何型態的數字、文字、變數、表達式、布林值。
```js
String(123) //將數字123轉為字串"123"
String(100 + 23) //將表達式100+23計算後轉為字串"123"
String(tue) // "true"
var word = 'hello world!'
console.log(word.toUpperCase())
// 得 HELLO WORLD!
var a = 'abcdef!!!g'.toUpperCase()
console.log(a)
// 變成大寫 ABCDEF!!!G ,符號不變。
var b = 'HI!!!JKLMN'.toLowerCase()
console.log(b)
// 轉成小寫 hijklmn
還有其他種方式可以將『小寫轉大寫』,但首先得先知道什麼是 ASCII Code?
ASCII Code 是一種存在電腦上 文字 對應的 號碼(Unicode值)。
返回在指定的位置字符的 Unicode 編碼 (A = 65 , B = 66 ... ; a = 97 , b = 98 ...)
var str = 'Aa'
var str1 = str.charCodeAt(0) // .charCodeAt(n),n表示字串位置。
var str2 = str.charCodeAt(1)
console.log(str1, str2)
// A=65,a=97,相差32。
同理,若想知道「數字」變成「文字」,可以用以下方法:
var str = String.fromCharCode(65) //從 UTF-16 code 換回英文字母
console.log(str)
// 得 A
若不知道大小寫數值相差多少時,可以醬子:
var a = "g"
var aCode = a.charCodeAt(0)
var str = String.fromCharCode(aCode - ("a".charCodeAt(0)-"A".charCodeAt(0)))
console.log(str)
// 得 G
若想用相差32來轉換大小寫:
var a = "g"
var aCode = a.charCodeAt(0)
var str = String.fromCharCode(aCode - 32) //用 UTF-16 code 方式來轉換大小寫。
console.log(str)
// 得 G
判斷是否為大寫字母?
var char = "J"
console.log(char >= "A" && char <= "Z")
// 得 true
判斷是否為小寫英文字母?
var char = "j"
console.log(char >= "a" && char <= "z")
// 得 true
var str = "hey hello world yoyoyo"
var index = str.indexOf("hello")
console.log(index)
var index = str.indexOf("hello!!")
console.log(index)
// 4 ,表示出現在第四個字元
// -1,負的表示沒出現在裡面
var str = "hey hello world yoyyoyo".replace("y", "!!!") //只會換第一個 y
console.log(str)
// he!!! hello world yoyyoyo
var str = "hey hello world yoyyoyo".replace(/y/g, "!!!") //全部 y 都會換
console.log(str)
// he!!! hello world !!!o!!!!!!o!!!o
var str="abc Def!"
console.log(str.replace(/abc/, "CBA"))//CBA Def!
var str = "hey hello world yoyyoyo"
console.log(str.split(" ")) //以空格來切割字串
console.log(str.split("y")) //以 y 來切割字串
// [ 'hey', 'hello', 'world', 'yoyyoyo' ]
// [ 'he', ' hello world ', 'o', '', 'o', 'o' ]
var str = " data1, data2, data3, data4 "
console.log(str.trim())
// data1, data2, data3, data4
()
因為不是函示)var str ="data1, data2, data3, data4"
console.log(str.length)
// 26 包含空格
var str ="data1, "
for (var i = 0; i < str.length; i++){
console.log(str[i]) //也可以像陣列用法,取出第n個字
}
// d
// a
// t
// a
// 1
// ,
stirng 倒印出來的方式之一。
string.substr(起始點,length) // length is optional
var str = 'mozilla'
console.log(str.substr(1,2))
console.log(str.substr(2))
console.log(str.substr(-1,1))
console.log(str.substr(-4,3))
// 'oz'
// 'zilla'
// 'a' (負數從後面算起)
// 'ill' (長度還是從前方算起)
補充: JavaScript字符串操作方法大全,包含ES6方法
用來取陣列長度,非函式。
只存於陣列元素之間,將陣列轉為字串。
var arr = [1, 2, 3]
console.log(arr.join("!"))
console.log(arr.join(""))
console.log(arr.join(","))
// 1!2!3
// 123
// 1,2,3
注意:輸出是字串喔!
var arr =[1, 2, 3]
function double(x) {
return x*2
}
console.log(arr.map(double))
// => 會將每個元素都帶到 function 去,然後用 function 的回傳值取代回陣列原本的值
// [ 2, 4, 6 ] 輸出為陣列
輸出為陣列的話,可以無限加:
var arr = [1, 2, 3]
console.log(
arr
.map(function(x){
return x*-1
})
.map(function(x){
return x*3
})
)
// 得 [ -3, -6, -9 ]
var arr = [1, 2, 3, -6, 3, -5]
console.log(
arr
.map(function(x){
return x*-1
})
.filter (function(x){
return x>0
})
)
// [ 6, 5 ]
var animals = ["ant", "bison", "camel", "duck", "elephant"]
console.log(animals.slice(2)) //從 2 開始切
console.log(animals.slice(2,4)) //從2開始切,切到 4 前
// [ 'camel', 'duck', 'elephant' ]
// [ 'camel', 'duck' ]
var months = ["Jan", "March", "April", "Maya"]
months.splice(1, 0, "Feb") //在1的位置,刪去0個,加入 “Feb”
console.log(months)
// [ 'Jan', 'Feb', 'March', 'April', 'Maya' ]
months.splice(4, 1, "May") //在4的位置,刪去1個,換成 ”May"
console.log(months)
// [ 'Jan', 'Feb', 'March', 'April', 'May' ]
months.splice(4, 1) //在4的位置,刪掉1個,加入0個
console.log(months)
//[ 'Jan', 'Feb', 'March', 'April' ]
數字的排序需注意
例一:
var months = ["March", "Jan", "Feb", "Dec"]
months.sort()
console.log(months)
// 得 [ "Dec", "Feb", "Jan", "March" ] ,按第一個英文字母排序
var number = [1, 30, 4 ,21]
number.sort()
console.log(number)
// [1, 21, 30 ,4] ,按第一個數字排列
例二,由小排到大(a<b):
方法一:
var arr = [1, 30, 4, 21] arr.sort(function(a,b)){ if(a === b) return 0 if(b>a) return -1 // 不換位置 return 1 // 換位置 } console.log(array) // 得 [1, 4, 21, 30 ]
方法二:
array1.sort(function (a, b) { return a - b // 正數要換位置 }) console.log(array) // 得 [1, 4, 21, 30 ]
例三,由大排到小(a>b):
方法一:
var array1 = [1, 30, 4, 21]
array1.sort(function (a, b) { if (a === b) return 0 if (b > a) return -1 return 1 }) console.log(array1)
>方法二:
```javascript
var array1 = [1, 30, 4, 21]
array1.sort(function (a, b) {
return b - a // 正數要換位置
})
console.log(array1)
// [ 30, 21, 4, 1 ]
方法三,三元運算子寫法:
var array1 = [1, 30, 4, 21]
arr.sort(function(a,b)) { if (a === b) return 0 return a>b ? -1 : 1 } console.log(array1) // 得 [30,21,4,1]
### reduce()
函式模樣:(初始值可以不用填,不填的預設為 0。)
```js
function(accumulator 累積器, currentValue目前的值){
return currentValue + accumulator
}
可在 Lv1-10 檔案看用法和替換方式筆記
回傳陣列總和:
題目一
[1,2,3].reduce(function (accumulator, value){
return accumulator + value
})
//得6
題目二
[1,2,3].reduce(function(accumulator, value){
return accumulator + value
}, 10)
//得16
題目一其他寫法
var ans = 0; [1,2,3].map(function(value){ ans = ans + value return ans }) console.log(ans)
var ans = 0; [1,2,3].forEach(function(value){ ans = ans + value }) console.log(ans)
其他小題
console.log([1,2,3].reduce(
function(obj, value){
obj["a"+value] = value
return obj
}, {}
))
//得{a1: 1, a2: 2, a3: 3}
2. <5的數量
```js
console.log([1,2,3,4,5,10,20].reduce(
function(count, value){
if(value < 5){
return count + 1
}
return count
}, 0
))
//得4
console.log([1,2,3,4,5,10,20].reduce(
function(count, value){
if(value < 5){
return count + value
}
return count
}, 0
))
//得10
把陣列元素都傳出來,例如:
['a', 'b', 'c'].forEach(function(x) {
console.log(x);
})
// "a" //"b" //"c"
---
## Math 內建函式
### Math.random()
產生 **0 <= n < 1 之間的隨機小數**,可以依需求乘倍數,例如:
```js
console.log(Math.random() * 10)
//產生 0 <= 10n < 10 之間的亂數
可參考之前寫得更詳細的筆記
往下取整數,無條件捨去小數點後面位數
console.log(Math.floor(1.9))
//prints 1
往上取整數,無條件進位
console.log(Math.ceil(1.9))
//prints 2
把字串變數字
var a = "50";
console.log(parseInt(a) === 50)
//prints true
可以傳入第二個參數,指定要以哪一個進位為底
var a = "50";
console.log(parseInt(a, 10))
//prints 50,以 10 進位為底
開根號
console.log(Math.sqrt(9))
//prints 3
console.log(Math.pw(2,10))
// 2 的 10 次方,得 1024
列印 1~10
var i = 1 loop or label: console.log(i) i++ if (i<=10) { goto loop } else { console.log('finished'); }
**control + c** => 強制關閉
## 下列方式可練習迴圈跑法:
> do... while... @12:20 分
1. 將 .js 檔案程式碼的頭和尾加上
```js
<script>
debugger
程式碼
</script>
(先做再判斷條件)
var i = 1
do {
console.log(i)
i ++
} while (i<= 3)
console.log('end = ', i)
// 1
// 2
// 3
// end = 4
continue 跑到下一迴圈 break 停止跳掉,直接跳出迴圈
var i = 1
do {
console.log(i)
i ++
if (i>100) {
break
}
} while (true)
console.log('i = ', i)
var i = 1
do {
console.log(i)
i ++
if ( i % 2 === 1) {
continue
}
console.log('偶數', i)
} while (i <= 4)
console.log('end:', i)
// 1
// 偶數 ㄉ
(先檢查條件再做)
var i = 1
while (i<=10) {
console.log(i)
i++
}
console.log('i=', i)
for (初始值; 終止條件 ; i 每一圈要做的事) {
}
var i = 1
for (i=1 ; i<=4 ; i++) {
console.log(i)
}
console.log('end', i)
// 1
// 2
// 3
// 4
// end : 5
var i = 1 if (i <= 4) { goto console.log(i)} console.log(i) i += 1
for (var i=1; i<5; i++) {
if (i===3) continue
console.log(i)
}
// 1
// 2
// 4
for (var i=1; i<5; i++) {
if (i===3) break
console.log(i)
}
// 1
// 2
var score = [10, 70, 90, 40]
for (var i = 0; i < score.length ; i++) {
console.log(score[i])
}
// 10
// 70
// 90
// 40
var score = [10, 70, 90, 40]
var sum = 0
for (var i = 0; i < score.length ; i++) {
sum += score[i]
}
console.log(sum)
// 210
var socre = [10, 70, 90 ,40]
var sum = 0
var i = 0
while (i<socre.length) {
sum += score[i]
i ++
}
console.log(sum)
function add(a,b){
console.log(a,b)
// return undefined
}
console.log(add(1,2))
// 1 2
// undefined
因為在 function 裡面 return 可加可不加,他的預設值都是 undefined
funciton add(a,b) {
return a+b
}
add(1,2)
// 沒東西出現,因為沒寫 log,無法印出來。
return 只會回傳一個值,之後跳出 console.log() 印出東西 在 google dev tool 裡面,有個灰色小箭頭是回傳值(指令的回傳值),可以忽略不理。
除了 object (物件,陣列)外,其他都是不可變的 immutable values。
var str = "hello"
str.toUpperCase() // 這樣寫對字串沒有用,不會改變原本的值。他一定會回傳一個新的值,所以須指定(創一個新的記憶體位置),如下
str = str.toUpperCase()
console.log(str)
// hello // HELLO
```js
var a = "hello"
a += "yo" // a = a + "yo",創一個新的記憶體位置,a 的原本質不變。因為記憶體位置不同。
console.log(a)
// helloyo
var arr = [1,2]
arr.push(4)
console.log(arr) // [1,2,4]
```js
var arr = [1,2]
newarr = arr.push(4)
console.log(newarr) // 表示新的長度
console.log(arr)
// 給出陣列的長度 : 3
// [1,2,4]
var arr = [1,2]
newarr = arr.reverse()
console.log(arr) console.log(newarr) // [2,1] // [2.1]
## 三、 拜託,請你愛用 console.log
```js
function isPrime(num) {
if(num === 1) return false
if(num === 2) return true
for (var i = 2; i<num; i++) {
if(num % i === 0) {
return false
} else {
return true
}
}
}
console.log(isPrime(2))
console.log(isPrime(17))
console.log(isPrime(37))
console.log(isPrime(14))
console.log(isPrime(15)) //這個答案錯誤,因數有 1,3,5,15。有 bug
該怎麼改呢?
function isPrime(num) {
console.log('num', num)
if(num === 1) return false
if(num === 2) return true
for (var i = 2; i<num; i++) {
console.log('i', i)
if(num % i === 0) {
console.log('num % i === 0', num, i)
return false
} else {
console.log('else', num, i)
return true
}
}
}
console.log(isPrime(2))
console.log(isPrime(17))
console.log(isPrime(37))
console.log(isPrime(14))
console.log(isPrime(15)) //這個答案錯誤,因數有 1,3,5,15。有 bug
> num 15
> i 2
> else 15 2
> true
正確改法:
function isPrime(num) {
console.log('num', num)
if(num === 1) return false
if(num === 2) return true
for (var i = 2; i<num; i++) {
console.log('i', i)
if(num % i === 0) {
console.log('num % i === 0', num, i)
return false
}
}
return true
//迴圈裡面沒有一個數字可以整除,代表這個數字是質數(除了1和該數自身外,無法被其他自然數整除的數)。
}
寫過才會記得住!(現在對此話抱持懷疑的心態 TT,但至少比較方便查閱!)
如何在終端機寫 JS?
邏輯運算 vs 位元運算
||
) 的性質:如果第一個參數不是 false,就回傳第一個值。&&
)的性質:當前面為 true,由後面決定值; 當前面為 false ,不論後面是什麼值,結果就是 false。false && true => false
!true => false
!false => true
3 || 10 => 3
false || 10 => 10
0 || 10 => 10
3 && 10 => 10
true && false => false
true && true => true
false && 3 => false (因為第一個值已經不是 true 了,後面就沒必要看了)
300 && 3 => 3 300 || 3 => 300
9 | 15 => 15 10 & 15 => 10
9 & 15 => 9 9 && 15 => 15
物件 (object)
物件是一種資料型態,用
{}
包起來。 W3School 說明物件可以包含屬性 (property) 和 函式 (method)。取得物件裡面的值有兩種方式:
變數的運算
需注意:
型態!
浮點數誤差! 所有程式都會遇到的問題,在電腦內存數字無法存得很精準。
字串加減乘除篇
'12'+'23' // "1223"
'1'-'2' // -1
'2'*'2' // 4
'4'/'2' // 2
字串 加 數字 = 字串數字 var x ='30' + 10 alert(x) //得 3010
數字 加 字串 = 數字字串 var x=5+"2" alert (x) //得52
數字 乘 數字 = 數字 var x=5*2 alert (x) //得 10
字串 乘 字串 = 數字 var x="5"*"2" alert(x) //得 10
數字 乘 字串 = 數字 var x=5*"2" alert (x) //得10
字串 乘 數字 = 數字 var x="2" * 5 alert (x) //得10
數字 除 字串 = 數字 var x = 10 / "2" alert(x) // 得5
字串 除 數字 =數字 var x = "20" / 5 alert(x) //得 4
console.log(typeof a) // 得 number,是數字的一種,但不是真的數字。
console.log(a === a) // 得 false!!因為 NaN 跟 NaN 都不是數字,也無法匹配,所以也無法相比。
補充:重新認識 JavaScript: Day 07 「比較」與自動轉型的規則 看自動轉型規則部分。
建議永遠使用三個等號,比較容易看出問題在哪。
從 Object 的等號真正理解變數
「Object 物件」和「Array 陣列」可以想成是「存記憶體位置」,而非數值內容。
如下例:
物件存取的方式: