js基础知识
判断语句
三个判断:
if else
三元运算符
switch case
if else
如果括号中只有一个值,默认转布尔值
如果在对象中,属性名不存在,那么获取的属性值永远是undefined
if(3){
console.log(100);
}else{
console.log(200);
}
//3-->true 100
let obj = {name:'sx'}
if(obj.sex){
console.log(100);
}else{
console.log(200)
}
//obj.sex-->undefined undefined-->false 200
括号里是 两个值作 == 判断
if( ({}) == [] ){
console.log(100)
}else{
console.log(200)
}
//对象与对象做==比较,空间不同 false 200
if(1){
//1成立执行的代码,如果成立,下面都不执行
}else if(2){
//2成立执行的代码,如果成立,下面都不执行
}else if(3){
//3成立执行的代码,如果成立,下面都不执行
}else{
//都不成立执行的代码
}
三元运算符(只适合简单的判断)
条件?条件成立执行的代码:不成立执行的代码
?:必须成对出现
if([] == false){
console.log(100);
}else{
console.log(200);
}
[] == false?console.log(100):console.log(200);
//三元运算符嵌套判断:
[] == false?( ![]==true?console.log(100):console.log(200) ):console.log(200);
switch case
num 和case后面的值会进行绝对比较
switch中,让小括号中的值和case后面的值进行绝对比较
let num = 100;
switch(num){
case"100":
console.log(100);该条件成立时执行的代码;
break;
case"100px":
console.log(100);
default:
break;//中断代码执行
console.log(500);
}
元素
在html中叫标签,在js中叫元素;
js中的元素都是对象数据类型的
要想操作谁,就要先获取谁。
document.getElementById
document: 上下文文本
get: 获取
Element: 元素
By: 通过
Id: id名
document.getElementsByTagName()
在document文本下通过标签名获取元素
document 上下文文本
get 获取
Element 元素
By 通过
Tag 标签
Name 名字
let div1 = document.getElementById('box');
div1.style.background="black"
div.onclick = function(){
//这里面的代码不运行,当点击元素的时候,这个函数就会执行;
div1.style.background="black"
}
div.onclick = function(){
if(div1.style.background==='black'){
div1.style.background="red"
}else{
div1.style.background="black"
}
}
循环
三个循环
for 循环
for 循环(四部曲)
初始化一个变量 i=0
判断条件是否成立
执行循环体(大括号里面的内容)
执行 i++
let arr = [100,2,5,5,2,4];
//用循环拿到数组的每一项
for(let i=0;i<arr.length;i++){
console.log(i);
}
i++
在自身基础上+1
先取值,再运算
++i 先运算,再取值
以上运算符号做的运算,结果一定是number类型
i+=1:可以理解为++i
i-=1:可以理解为--i
let a = 10;
let b = a++;
console.log(b) // 10
console.log(a) // 11
let b = ++a;
console.log(b) // 11
for(let i=0;i<6;i++){
console.log(100) //输出6次
}
for(let i=0;i<6;i++){
console.log(100); //输出一次
break; //终止for循环,终止的是整个for循环
}
for(let i=0;i<6;i++){
console.log(100);
continue; //终止本轮循环,continue下面的代码不执行;不终止整个循环
console.log(200); //不输出
}
for in 循环:
let arr = {name:'zhufeng',age:10,4:9,1:3};
for(let key in obj){
console.log(key) //1 4 zhufeng 10
//会把对象中属性名是数字的先输出,并且按照从小到大的顺序输出
console.log(obj.[key]) // 'zhufeng' 10
// key是变量,代表的是字符串'name' 第一次循环
// 所以不能用 obj.key方法 也不能['key'],就不是变量而是字符串了。
}
while 循环
当不知道循环多少次时,会使用到while循环;
while 阻塞线程;
let i =3;
while(i<6){
i++;
console.log(100)
}
console.log(i) // 6
逻辑且:&& 逻辑或:||
逻辑且:&&
如果前边转布尔是true,就取后边的,反之,就取前边的
let num = 1&&2
console.log(num)//2
当&&左右两边的语句都为真,则这个逻辑判断为真
当&&左右两边的语句有一个为假或都为假时,这个逻辑判断为假
逻辑或:||
如果前边转布尔是false,就取后边的,反之就取前边的
let num = 1||2
console.log(num)//1
当||左右两边的语句有一个为真,或都为真时,这个逻辑判断为真
当||左右两边的语句都为假时,这个逻辑判断为假
代码运行机制,堆栈内存解析
打开浏览器时
分配出一块栈内存,为代码提供运行环境(栈内存形成之后,会分成两块,一块是值存储区,一块是变量存储区)
再分配出一个主线程,执行代码
代码执行时,代码解析从上到下,依次进行,
第一句代码进栈,执行完毕后出栈,
第二句才能进栈
创建一个变量,变量放到变量存储区,
此时,如果值是基本数据类型,就放到值存储区。
如果值是引用数据类型,就开辟一个堆内存,生成一个16进制地址把对象的键值存储进去,把这个16进制的地址返回到值存储区,相互关联,把值赋给变量。
例子1
例子2:
列子3:
数据类型检测
-
typeof
- 检测数据类型 特点: - 返回值是一个字符串 - 字符串里放的是他的数据类型 缺点: - typeof检测数组、普通对象、null 返回值都是'object',所以typeof检测数据类型,无法将null、数组、普通对象细分
typeof null 返回值是'object'
typeof [] 返回值是'object'
typeof ({}) 返回值是'object'
console.log(typeof 11)//'number'
console.log(typeof '121')//'string'
console.log(typeof undefined)//'undefined'
console.log(typeof true)//'boolean'
console.log(typeof null)//'object'
console.log(typeof [])//'object'
console.log(typeof ({}))//'object'
console.log(typeof typeof typeof 12)//'string'
instanceof
检测当前实例是否属于某个类
- 它是检测当前实例是否属于某个类,属于为true,不属于为false
- 写法:实例instanceof类
- 局限性:instanceof不能检测基本数据类型,只能检测引用数据类型的值 检测基本数据类型检测不了只能为false
constructor
基于构造函数检测数据类型
- constructor 检测类 有为true 没有为false
应用方法:
- 1.不能把类的原型重定向
- 2.不能再私有属性上加constructor
Object.prototype.toString.call()
检测数据类型最好的方式