Example:
function id(value) {
return value;
};
id('Hello World'); // Hello World
// ===== 這是分隔線 ===== //
function f() {};
f(); // undefined
id('Hello World')
。Example:
new Date()
new String()
new Number()
new Boolean()
new Promise()
new Function()
new Error()
obj.method()
。Example:
function add(param1, param2) { // 這裡有兩個參數分別是 param1, param2
return param1 + param2;
};
Example:
add(2, 4); // 這裡有兩個引數分別是 2, 4
Example:
function id(x) {
return x;
};
console.log(id instanceof Function); // true
console.log(typeof id === 'function'); // true
Example:
var add = function (x, y) {
return x + y;
};
console.log(add(2, 3));
function
中並沒有名稱,故又可以稱為匿名的函式運算式 (anonymous function expression)Example:
var fac = function me(n) {
if (n > 0) {
return n * me(n-1); // 4 * 3 * 2 * 1
} else {
return 1;
};
};
console.log(fac(3)) // 6
console.log(fac(4)) // 會得到什麼 ?
console.log(me) //注意 ! Reference:me is not defined
Example:
function add(x, y) {
return x + y;
};
Example:
var add = new Function('x', 'y', 'return x + y');
console.log(add(1, 2)); // 3
拉升 (hosting) 代表者移動到一個範疇 (scope) 開頭 (頂端) 的地方。
Example:
console.log(foo()); // 要印出 foo() 可以預期會得到 'Hello'
function foo() { // foo 函式會被拉升
return 'Hello';
};
// ===== 這是分隔線 ===== //
// 上述的程式,實際執行的流程如下
function foo() {
return 'Hello';
};
console.log(foo());
Example:
console.log(foo()); // "TypeError: foo is not a function
var foo = function () {
return 'World';
};
// ===== 這是分隔線 ===== //
// 上述的程式,實際執行的流程如下
var foo; // 1. 變數宣告會被提升到 scope 的最頂端
console.log(foo()); // 2. 執行foo(),會出現錯誤 "TypeError: foo is not a function
console.log(foo); // 會出現什麼 ?
foo = function () {
return 'World';
};
變數與函式的拉升的不同之處在於,變數的拉升只有宣告部份,而函式的拉升是整個函式,因此函式在宣告前是可以執行的。
Example:
console.log(a); // 會得到 undefined
var a = 2;
// ===== 這是分隔線 ===== //
// 上述的程式,實際執行的流程如下
var a; // 1. 變數宣告會被提升到 scope 的最頂端
console.log(a); // 2. 嘗試印出 a,會得到 undefined
a = 2;
undefined
。Example:
foo(); // 會得到什麼 ?
function foo() {
console.log(1);
};
function foo() {
console.log(2);
};
function foo() {
console.log(3);
};
Example:
function add(x, y) {
return x + y;
};
console.log(add.name) // 'add'
Example:
var add = function (x, y) {
return x + y;
};
console.log(add.name) // '書中寫空字串,但是實際上會印出 add'
Example:
var add = function addNumberMethod(x, y) {
return x + y;
};
console.log(add.name) // 'addNumberMethod'
Example:
// 函式宣告
function add(x ,y) {
return x + y
}
// 函式運算式
const add = function (x, y) {
return x + y
}
Example:
export const convertNullToString = (object) => (
JSON.parse(JSON.stringify(object, (k, v) => (v === null ? '' : v)))
)
export const convertEmptyStringToNull = (object) => (
JSON.parse(JSON.stringify(object, (k, v) => (v === '' ? null : v)))
)
export const sortStringAsc = (a, b) => { return a >= b ? 1 : -1 }
export const sortStringDesc = (a, b) => { return a <= b ? 1 : -1 }
export const parseDecimal = (value) => {
if (typeof value === 'number') { return new Decimal(value) }
if (typeof value !== 'string') { return new Decimal(0) }
let number = value.replace(/\s/g, '').replace(/,/g, '')
number = number.replace(/\.+/g, '.').replace(/\.$/, '')
return new Decimal(number)
}
export const floorToDigits = (amount, digits) => {
const number = Math.pow(10, digits)
return Math.floor(amount * number) / number
}
export const stringToArray = (value) => {
if (Array.isArray(value)) return value
if (typeof value !== 'string' || value === '') return []
return value.split(',').map((v) => v.trim())
}
export const arrayToString = (array) => (
_.isEmpty(array) ? '' : array.filter(element => element).join(', ')
)
export const ModeIcon = ({ cell }) => {
switch (cell) {
case 'AIR':
return <div className='text-info'><i className='fas fa-plane' /></div>
case 'SEA':
return <div className='text-info'><i className='fas fa-ship' /></div>
case 'RAIL':
return <div className='text-info'><i className='fas fa-train' /></div>
case 'TRUCK':
return <div className='text-info'><i className='fas fa-truck' /></div>
default:
return { cell }
}
}
Example:
function add1(x, y) {
return x + y
}
var plus1 = add1.bind(null, 1)
console.log(plus1(5)) // 6
// ========== 這是分隔線 ========== //
function add2(x, y, z) {
return x + y + z
}
var plus2 = add2.bind(null, 1, 2)
console.log(plus2(5)) // 會得到什麼 ?
Example:
var foo = {
name: 'alan',
logName: function () {
console.log(this.name)
}
}
var bar = {
name: 'mike'
}
console.log(foo.logName()) // 會得到什麼 ?
console.log(foo.logName.bind(bar)()) // 會得到什麼 ?
Example:
function add1(x, y) {
return x + y
}
var plus1 = add1.apply(null, [1, 5])
console.log(plus1) // 會得到什麼 ?
Example:
const foo = {
name: 'alan',
logName: function () {
console.log(this.name)
}
}
const bar = {
name: 'mike'
}
console.log(foo.logName()) // 會得到什麼 ?
console.log(foo.logName.apply(bar)) // 會得到什麼 ?
Example:
function add1(x, y) {
return x + y
}
var plus1 = add1.call(null, 1, 5)
console.log(plus1) // 6
Example:
const foo = {
name: 'soto',
logName: function () {
console.log(this.name)
}
}
const bar = {
name: 'mike'
}
console.log(foo.logName()) // 'soto'
console.log(foo.logName.call(bar)) // 'mike'
// 1
var sampleObj = {}
fn.call(sampleObj, 'arg1', 'arg2')
// 2
var sampleObj = {}
fn.apply(sampleObj, ['arg1', 'arg2'])
// 3
var sampleObj = {}
fn.bind(sampleObj, 'arg1', 'arg2')()
var fn = function (patam1, param2) {
console.log(this.key1) // 會得到 1
console.log(patam1) // 'arg1'
console.log(param2) // 'arg2'
}
// 1
var sampleObj = {key1: 1}
fn.call(sampleObj, 'arg1', 'arg2')
// 2
var sampleObj = {key1: 2}
fn.apply(sampleObj, ['arg1', 'arg2'])
// // 3
var sampleObj = {key1: 3}
fn.bind(sampleObj, 'arg1', 'arg2')()
Example:
function logArgs(x, y, z) {
console.log(x)
console.log(y)
console.log(z)
}
logArgs('Hello', 'World', 'React', 'JavaScript') // 'JavaScript' 被忽略掉
Example:
function logArgs(x, y, z) {
console.log(x)
console.log(y)
console.log(z) // undefined
}
logArgs('Hello', 'World')
Example:
function logArgs(x, y, z) {
console.log(arguments) // *['Hello', 'World', 'React'] <== 是斜的*
console.log(arguments.length) // 3
console.log(arguments[0]) // 'Hello'
console.log(arguments[1]) // 'World'
}
logArgs('Hello', 'World', 'React')
Example:非 strict
function funa(param) {
param = 'Hello'
return arguments[0]
}
console.log(funa('value')) // 'Hello'
Example:strict
function funb(param) {
'use strict'
param = 'Hello'
return arguments[0]
}
console.log(funb('value')) // 會得到什麼 ?
Example:
function funb(param) {
'use strict'
param = 'Hello' // 無用
return [
arguments[0].toUpperCase(), // 'VALUE'
arguments[0].split(''), // ["v", "a", "l", "u", "e"]
arguments[0].length // 5
]
}
console.log(funb('value'))
這裡是指針對一個函式的參數是有選擇性 (有給或不給) 的話,我們通常會給一個預設值,以下有四種 + 一 種 (ES6) 檢查的方式。
Example:
function message(option1, option2, option3) {
if (option3 === undefined) option3 = 'default value'
return option1 + option2 + option3
}
console.log(message('Hello', 'World'))
Example:
function message(option1, option2, option3) {
if (!option3) option3 = 'default value'
return option1 + option2 + option3
}
console.log(message('Hello', 'World'))
Example:
function message(option1, option2, option3) {
option3 = option3 || 'default value'
return option1 + option2 + option3
}
console.log(message('Hello', 'World'))
Example:
function message(option1, option2, option3) {
if (arguments.length < 3) option3 = 'default value'
return option1 + option2 + option3
}
console.log(message('Hello', 'World'))
Example:
function message(option1, option2, option3 = 'default value') {
return option1 + option2 + option3
}
console.log(message('Hello', 'World'))
message('Hello', 'World')
還是 message('Hello', 'World', undefined)
,在這兩個情況裡,都會得到 option3 = 'default value'
。message('Hello', 'World')
會得到 option3 = 'default value'
,但是,如果是 message('Hello', 'World', undefined)
的話,反而會將 option3
的值視為 undefined
,進而得到 'HelloWorldundefined'
這種奇怪的值。如果有一個函式是 selectOptions(10, 20, 5)
,在呼叫的時候帶了 3 個引數,可是會看不出來這是什麼意思。
Pyton 支援具名參數用法,因此在 Pyton 的世界裡,此函式會是。
selectOptions(start = 10, end = 20, step = 5)
如果有一個函式是selectOptions(10, null, 5)
,今天第二個參數不帶值,第三個參數要帶值,哪就必須使用 null 來佔位,卡住第二個參數的位置。
如果是 Pyton 的話,可以這樣寫。
Example:
selectOptions(step = 5) // 不需要使用 null 來佔位
selectOptions(end = 20, start = 10) // 還可以互換順序
Example:
function selectOptions(options = {}) {
const { start } = options || 0
const { end } = options || 0
const { step } = options || 0
console.log(start) // 10
console.log(end) // 20
console.log(step) // 5
}
selectOptions({start: 10, end: 20, step: 5})
Example:
selectOptions(option1, option2, {start: 10, end: 20, step: 5})