JavaScript学习笔记

JavasScript学习笔记

1、字符串的不可变性

eg.

let str = "abcd"
str[0] = 'f'
console.log(str[0]);// 输出是a

不能改变单个字符的值,只能重新赋值整个字符串。

判断类型:

typeof(str) == ‘string’

2、数组

Array可以包含任意的数据类型

let arr = [1,2,3,null,'abc']

1、长度

arr.length

2、indexOf,通过元素获得下标索引

3、slice() 截取Array的一部分,返回一个新的数组

4、push,pop

​ push;压入到尾部

​ pop弹出一个元素

5、unshift(),shift()

​ unshift压入到头部

​ shift弹出头部的一个元素

6、sort()排序

7、元素反转reverse()

8、concat()拼接数组,返回一个新是数组

9、连接符join()

​ 打印拼接数组,使用特定的字符串连接

let arr = ["c","b","a"]
arr.join("-")
"c-b-a"

10、多维数组

let arr = [[1,2,3],[4,5,6]]
arr[0][1]// 2

3、对象

// 定义了一个对象
var 对象名 = {
    属性名: 属性值,
    属性名: 属性值,
    属性名: 属性值
}

用{}包裹,键值对描述属性。

JavaScript中所有的键都是字符串,值是任意对象。

1、使用一个不存在的对象属性,不会报错! undefined而已

2、动态的删减属性(delete删除属性)

delete person.name

3、动态的添加(直接给新属性添加值)

person.haha = "hello"

4、判断属性值是否在这个对象中

'haha' in person
true
// 继承
'toString' in person
true

5、判断一个属性是否是对象自身的

person.hasOwnProperty('toString')
false
person.hasOwnProperty('haha')
true

4、流程控制

1、if-else判断

2、while循环

while(age<100){
    age = age +1;
    console.log(age)
}

3、for循环

for(let i = 0;i<100;i++){
    console.log(i)
}

4、forEach循环(ES5.1)

var age = [1,2,3,4,5]
age.forEach(function(value){
    console.log(value)
})

5、for…in遍历/for…of(ES6)

for(var num in age){
    // num是索引
    console.log(age[num])
}
for(var num of age){
    // num是值
    console.log(num)
}

5、Map和Set(ES6新特性)

// 取值
var map = new Map(['tom',100],['jack',90])
var name = map.get('tom')
console.log(name)//获得100

//设值
map.set('admin',100);
map.delete('tom')

//遍历map
for....of..

Set:无序不重复的集合

(可以去重复值)

var set = new Set([3,2,2,2])
set.delete(2)
set.add(1)
//是否有这个元素
console.log(set.has(3))

//遍历
for...of

5、函数

方法:对象(属性,方法)

函数:不属于对象

5.1定义函数

定义方式一

function abs(x){
    if(x>=0){
        return x;    
    }else{
        return -x;
    }
}

如果没有执行return,函数执行完也会返回结果,结果就是undefined

定义方式二

把函数赋值给对象,对象就成函数了。

var abs = function(x){

}

不存在参数如何规避?

// 手动抛出异常
if(typeof x!=='number'){
    throw 'Not a Number'
}

arguments

arguments 是一个关键字

代表传递进来的所有参数是一个数组。

即使你只定义了一个参数,但是你传入多个参数,可以用arguments来获取。

…rest

ES6新特性,获取除了已经定义的参数之外的参数。

function fun(a,b,c,...rest){
    console.log(rest)
}

5.2、变量的作用域

var定义的变量实际是有作用域的。

在函数内声明,则在函数体外不可以使用。(闭包可实现)

内部函数可以访问外部函数的成员,反之则不行。

假如,内部函数变量和外部函数的变量重名,则用内部的。从内往外找。

5.3提升变量的作用域

function a(){
    var x = 'x'+y;
    console.log(x);
    var y ='y';
}
//结果:输出xundefined
//结论:js执行引擎,自动提示了y的声明,但不会提升y的赋值。

变量的定义都写在前面。

//var x,y,z…

5.4全局变量

在外部定义。

全局对象window。

默认所有的全局变量都绑定在window对象下。

alert()也是window下的变量。

方法也是变量,也是可以赋值的。

js只有一个全局作用域,就是window。

5.5规范

由于所有的全局变量都会绑定到window上,如果使用了不同的js文件,使用了相同的全局变量,就会冲突。

如何减少冲突?

//唯一全局变量
var a = {}//定义全局变量
a.name = "jadfa";
a.add = function(a,b){
    return a+b;
}

把自己的代码全部放入自己定义的唯一空间名字中,降低全局命名冲突。

局部作用域let

ES6引入,解决局部作用域冲突问题。

{}里面,一个作用域。

常量const

ES6之前,只要是全部使用大写字母定义的变量就认为是常量,不要去动它。

ES6后用const定义。只读。

5.6方法

方法就是把函数方到对象里面。

方法调用一定要带()

this。代表调用它的人。

apply

在js中可以控制this的指向

getAge.apply(对象,[]);//this指向了指定对象

6、内部对象

标准对象

typeof 123
"number"

typeof '123'
"string"

typeof []
"object"

typeof NaN
"number"

typeof Math.abs
"function"

typeof true 
"boolean"

typeof undefined
"undefined"

6.1、Date

var now = new Date();
now.getFullYear();//年
now.getMonth();//0-11
now.getDate();//日
now.getDay();//星期几
now.getHours();//时
now.getMinuters();//分
now.getSeconds();//秒

now.getTime();//时间戳,距离1970.。


6.2、JSON

轻量级的数据交换格式。

在javascript中一切皆为对象,任何js支持的类型都可以用JSON来表示。

格式

对象都用{}

数组都用[]

键值对key:value

对象转换JSON字符串

JSON.stringify()

JSON字符串解析成对象

JSON.parse()

JSON和JS对象的区别

var obj = {a: 'hello',b: 'ji'}
var json = '{"a": "hello","b": "ji"}'

7、面向对象编程

7.1、proto继承原型对象

var Student = {
    name: "liuguo",
    age: 3,
    run: function(){
        console.log("run...")
    }
}
var xiaoming = {
    name: "xiaoming"
};
//继承
xiaoming.__proto__ = Student;

7.2、class继承

ES6引入class关键字

1、定义一个类,属性,方法

class Studnet{
    constructor(name){
        this.name = name;
    }
    hello(){
        alter('hello')
    }
}
var xiaoming = new Student("xiaoming")

2、继承

class XiaoStudent extends Student{
	construtor(name,grade){
        super(name);
        this.grade = grade;
    }
    myGrade(){
        console.log("adfaf")
    }
}

class的本质还是__proto__,只是为了更方便书写。

原型链

无限继承

8、操作BOM对象

BOM:浏览器对象模型

window代表浏览器窗口

navigator:封装了浏览器的 信息

screen:屏幕width,height

location:当前页面的url信息

reload()//刷新网页

assign()//设置新的地址

document

代表当前的页面

获取文档节点document.getElementById()

获取cookir

document.cookie

history

history.back()//后退

history.forward()//前进

9、操作DOM对象

更新:更新DOM节点

node.innerText

node.innerHTML

node.style.

遍历DOM节点:得到节点

要操作一个DOM节点,就必须先获得这个节点。

删除一个DOM节点

先获取父节点,再通过父节点删除自己。

var father = p1.parentElement
father.removeChild(p1)

father.removeChild(father.children[0])

添加一个新的节点

innerHTML//会覆盖

var newp =  document.createElement('p')
newp.id = 'newp'
nwep.innerText = "helloworld"

newp.setAttribute('','')

node.appendChild(newp);

10、JQuery

里面存在大量的javascript函数

script 标签引入
​ 公式: $(selector).action()

$代表JQuery

selector就是css的选择器

//选中标签,进行函数操作

$('#id').click(function(){
	console.log("afs")
})

事件
mousedown()
mouseover()
等等

11、闭包

闭包就是嵌套函数,内部的函数可以访问外部函数的作用域。
img

一般情况下,在函数fn执行完后,就应该连同它里面的变量一同被销毁,但是在这个例子中,匿名函数作为fn的返回值被赋值给了fn1,这时候相当于fn1=function(){var n = 0 … },并且匿名函数内部引用着fn里的变量num,所以变量num无法被销毁,而变量n是每次被调用时新创建的,所以每次fn1执行完后它就把属于自己的变量连同自己一起销毁,于是乎最后就剩下孤零零的num,于是这里就产生了内存消耗的问题

作用:

  1. 可以在函数的外部访问到函数内部的局部变量。
  2. 让这些变量始终保存在内存中,不会随着函数的结束而自动销毁。

但我们可以使用闭包来模拟私有方法
如果不是某些特定任务需要使用闭包,在其它函数中创建函数是不明智的,因为闭包在处理速度和内存消耗方面对脚本性能具有负面影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值