js 实用基础讲义(一)

2020-08-28  本文已影响0人  不二家的糖果屋

########## -> 目录 <- ##########

讲义内容概括

1 - 包括:

a - JavaScript 语法 【 初级 】

b - ES6 语法 【 初级 】

c - MVVM 框架讲解

d - VUE 原理讲解

e - VUE 语法 【 初级 】

f - VUE 脚手架 及 webpack 配置 【 基础 】

g - chrome 调试方法 【 初级 】

2 - 不包括:

a - HTML HTML5 语法

b - CSS CSS3 语法

c - CSS 拓展语言 【 less sass 】

d - 编码规范

########## -> 内容 <- ##########

a - JavaScript 语法 【 初级 】

1 - 赋值

var x = 1;

2 - 注释

// var x = 1;

/*

var x = 1;

var y = 2;

*/

3 - 数据类型

3.1 - Number

1

0.1

-99

NaN // NaN 表示 Not a Number,当无法计算结果时用 NaN 表示,如 0/0

Infinity // Infinity 表示无限大,如 2/0

3.2 - 字符串

'abc'

"abc" // 推荐 单引号 因为输入比较快

'a' + 'b' // 'ab'

var str = 'C'

var strNew = `12${str}34` // 模版字符串 'aCb' 【 ## ES6 新增 ## 】 *********

console.info(strNew)

长度

.length

字符串常用方法

.toUpperCase()

.toLowerCase()

.indexOf('xxx') // 返回索引

.substring(startIndex, endIndex) // 指定索引区间的子串 【 不含 endIndex | 原字符串不变 】

3.3 - 布尔

true false

3.4 - null 和 undefined

null 表示一个空值

undefined 表示未定义

区分两者的意义不大。

大多数情况下,我们都应该用 null。

undefined 仅仅在判断函数参数是否传递的情况下有用。

3.5 - 数组

var ls = [1, 'a', false, null]

new Array(1, 'a', true) // [1, 'a', true] 出于代码的可读性考虑,强烈建议直接使用[]

索引初始值为 0,即 ls[0] = 1

长度

.length

数组常用方法

.indexOf('x')

.slice(startIndex, endIndex) // 截取 Array 的部分元素,返回新 Array 【 不含 endIndex | 原数组不变 】

.push() // 向 Array 的末尾添加若干元素 返回 插入后的长度 【 原数组改变 】

.pop() // 把 Array 的最后一个元素删除掉 返回 删除的元素 【 原数组改变 】

.unshift() // 向 Array 的头部添加若干元素 返回 插入后的长度 【 原数组改变 】

.shift() // 把 Array 的第一个元素删除掉 返回 删除的元素 【 原数组改变 】

.sort() // 默认排序 [1, 3, 2].sort() // [1, 2, 3] 【 可自定义规则 ## 见 函数 -> 高阶函数 ## | 原数组改变 】

.reverse() // 反转 [1, 3, 2].reverse() // [2, 3, 1] 【 原数组改变 】

.splice(index, howmany, item1, ...) 【 *** 非常好用 ***】

var arr = ['a', 'b', 'c']

arr.splice(0, 1) // 返回 删除的元素 ['a'] arr->['b', 'c'] 【 原数组改变 】

arr.splice(0, 0, 'd') // 返回 删除的元素 [] arr->["d", "a", "b", "c"]

.concat(arr2) // 将 Array 与 另一个 Array 连接 返回 拼接后数组 【 原数组不变 】

.join(string) // 把 Array 的每个元素都用指定的字符串连接起来,返回 连接后的字符串 【 原数组不变 】

var arr = ['A', 'B', 'C', 1, 2, 3]

arr.join('-'); // 'A-B-C-1-2-3'

3.6 - 对象

var obj = {

name: 'Jack',

city: 'Shenyang'

xk-key: 'abc'

}

obj.name // 'Jack'

obj.name = 'Tom'

obj.xk-key // error

obj['xk-key'] // 'Tom'

删除属性

delete obj.name // obj.name -> undefined

属性是否存在

'city' in obj // true

注意:

如果 in 判断一个属性存在,这个属性不一定是 obj 的。

它可能是 obj 继承得到的:

'toString' in obj // true

因为 toString 定义在 object 对象中,而所有对象最终都会在原型链上指向 object,所以 obj 也拥有 toString 属性

## 原型链原理略 ##

判断一个属性是否是 obj 自身拥有的,而非继承得到的,可以用 hasOwnProperty() 方法:

var objNew = {

name: 'abc'

}

objNew.hasOwnProperty('name') // true

objNew.hasOwnProperty('toString') // false

3.7 - 变量

变量名是大小写英文、数字、$和_的组合,且不能用数字开头。

变量名也不能是 JavaScript 的关键字,如 if、while 等。

申明一个变量用 var 语句。

var $b = 1

弱类型

$b = 'abc'

3.8 - 比较运算符

>

<

>=

<=

== 比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果。

=== 它不会自动转换数据类型,如果数据类型不一致,返回false,如果一致,再比较。

NaN 这个特殊的 Number 与所有其他值都不相等,包括它自己。

NaN === NaN // false

判断 NaN 的方法

isNaN(NaN) // true

最后要注意浮点数的相等比较

1 / 3 === (1 - 2 / 3) // false

这不是 JavaScript 的设计缺陷。浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。

要比较两个浮点数是否相等,只能计算它们之差的绝对值,看是否小于某个阈值:

Math.abs(1 / 3 - (1 - 2 / 3)) < 0.0000001 // true 【 JavaScript Math(算数)对象 】

4 - 条件判断

if (case1) {

// do something

} else {

// do something

}

if (case1)

console.info('do something') // 如果语句块只包含一条语句,可省略 {} 【不建议这样写,一旦超过一行就会容易出错】

else

console.info('do something')

if (case1) {

// do something

} else if (case2) {

// do something

} else {

// do something

}

5 - 循环

a -

var ls = [1, 2, 3]

for (var i = 0; i < ls.length; i++) {

console.info(ls[i])

}

for 循环的 3 个条件都是可以省略,如果没有退出循环的判断条件,就必须使用 break 语句退出循环,否则就是死循环

var x = 0

for (;;) { // 将无限循环下去

if (x > 100) {

break // 通过 if 判断来退出循环

}

x++

}

b -

for...in 把一个对象的所有属性依次循环出来

var o = {

name: 'Jack',

age: 20,

city: 'Beijing'

}

for (var key in o) {

console.log(key); // 'name', 'age', 'city'

}

由于 Array 也是对象,而它的每个元素的索引被视为对象的属性,因此,for...in 循环可以直接循环出 Array 的索引

var a = ['A', 'B', 'C']

for (var i in a) {

console.log(i) // '0', '1', '2'

console.log(a[i]) // 'A', 'B', 'C'

}

注意,for...in 对 Array 的循环得到的是 String 而不是 Number

c -

var n = 99

while (n > 0) {

// do something

n = n - 1 // n--

}

d -

do {...} while(),它和 while 循环的唯一区别在于,不是在每次循环开始的时候判断条件,而是在每次循环完成的时候判断条件

var n = 0

do {

// do something

n = n + 1 // n++

} while (n < 100)

注意,用 do {...} while() 循环要小心,循环体会至少执行1次,而 for 和 while 循环则可能一次都不执行

6 - 函数

a - 定义

function funA (params) {

return

}

var funA = function (params) {

// return

}

注意,函数体内部的语句在执行时,一旦执行到 return 时,函数就执行完毕,并将结果返回。

因此,函数内部通过条件判断和循环可以实现非常复杂的逻辑。

如果没有 return 语句,函数执行完毕后也会返回结果,结果为 undefined。

b - 调用

funA()

funA(123, 'xyz') // JavaScript 允许传入任意个参数而不影响调用,参数个数不影响调用

c - 变量作用域与解构赋值

## 略 ##

d - 高阶函数

1 - map

var ls = [11, 22, 33]

ls.map(item => {

console.info(item) // 11 22 33

})

var ls = [11, 22, 33]

ls.map((item, index, ls) => {

console.info(index) // 0 1 2

console.info(item) // 11 22 33

console.info(ls) // 11 22 33

})

2 - reduce

## 略 ##

3 - filter 【 原数组不变 】

var arr = [1, 2, 4, 5, 6, 9, 10, 15]

var r = arr.filter(function (x) {

return x % 2 !== 0 // 据返回值是 true 还是 false 决定保留还是丢弃该元素

})

console.info(r) // [1, 5, 9, 15]

4 - sort

[10, 20, 1, 2].sort(); // [1, 10, 2, 20]

无法理解的结果

因为 Array 的 sort() 方法默认把所有元素先转换为 String 再排序,

结果 '10' 排在了 '2' 的前面,因为字符 '1' 比字符 '2' 的 ASCII 码小

var a = '1'

var b = '2'

a.charCodeAt() // 49 String.fromCharCode(49)

b.charCodeAt() // 50

通常规定,对于两个元素 x 和 y,

如果 x < y,则返回 -1,

如果 x === y,则返回 0,

如果 x > y,则返回 1

var arr = [10, 20, 1, 2]

console.info(arr.sort())

arr.sort(function (x, y) {

if (x < y) {

return -1

}

if (x > y) {

return 1

}

return 0

})

console.log(arr) // [1, 2, 10, 20]

arr.sort(function (x, y) {

if (x < y) {

return 1

}

if (x > y) {

return -1

}

return 0

})

console.log(arr) // [20, 10, 2, 1]

5 - Array

除了 map()、reduce、filter()、sort() 这些方法可以传入一个函数外,Array对象还提供了很多非常实用的高阶函数。

5.1 - every 判断数组的所有元素是否满足测试条件

var arr = ['Apple', 'pear', 'orange']

console.log(arr.every(function (s) {

return s.length > 0

})) // true 因为每个元素都满足s.length>0

console.log(arr.every(function (s) {

return s.toLowerCase() === s;

})) // false 因为不是每个元素都全部是小写

5.2 - find 用于查找符合条件的第一个元素,如果找到了,返回这个元素,否则,返回 undefined

var arr = ['Apple', 'pear', 'orange']

console.log(arr.find(function (s) {

  return s.toLowerCase() === s

})) // 'pear' 因为pear全部是小写

console.log(arr.find(function (s) {

  return s.toUpperCase() === s

})) // undefined 因为没有全部是大写的元素

5.3 - findIndex 和 find 类似,也是查找符合条件的第一个元素,返回这个元素的索引,如果没有找到,返回-1

5.4 - forEach 和 map 类似,它也把每个元素依次作用于传入的函数,但不会返回新的数组

var arr = [0, 2, 4, 6, 8]

var str = arr.map(function(item, index, arr) { // 原数组arr

console.log("原数组arr:", arr)

return item/2

}, this)

console.log(str) // [0, 1, 2, 3, 4]

var arr = [0, 2, 4, 6, 8]

var sum = 0

var str = arr.forEach(function(item, index, arr) { // 原数组arr

sum += item

console.log("sum的值为:", sum) //0 2 6 12 20

},this)

console.log(str); // undefined

上一篇下一篇

猜你喜欢

热点阅读