//1. ES3
var a=12;
//2. ES6--let
let b=1;
b=2;
//3. ES6--const:CONST创建的变量,存储的值不能被修改(可以理解为叫做常量)--其实是指针不能别修改
const c=1; //=>undefined
c=2 //=>VM218:1 Uncaught TypeError: Assignment to constant variable.
//4. 创建函数也相当于创建变量
function fn(){}
//5. 创建类也相当于创建变量
class A{}
//6. ES6的模块导入也可以创建变量
import B from './B.js';
//7. Symbol 创建唯一值
let m=Symbol(100)
let n=Symbol(100)
m==n;//=> false
let num=null; //=>let num=0;
一般最好用null作为初始的空值,因为零不是空值,它在栈内存中有自己的存储空间(占了位置)
···
num=12;
let num;//=>创建一个变量没有赋值,默认值是undefined
num=12;
console.log(person.name); //name是具体的属性名
console.log(person['name']); //name是具体的属性名
console.log(person[name]); //代表name是一个变量
console.log(person['age']);
console.log(person.sex);
console.log(person[1]);
console.log(person['1']);
console.log(person.1);
//Uncaught SyntaxError: Unexpected number
let obj={
name:'cat',
age:2,
1:100,
2:200,
true:300
}
for(var key in obj){
if(key==='true') continue;//会跳过
// if(key===true) continue;//不会跳过
console.log(key+'---'+obj[key]);
}
person.GF='Lily';
person.name='Danny';
console.log(person.GF);
console.log(person.name);
//假删除
person.weight=null;
console.log(person);//null
//真删除
delete person.weight;
console.log(person);//undefined
let ary = [12,'aa',true,13];
console.log(ary);
console.log(ary.length);
console.log(ary['length']);
console.log(ary[1]);
//第一项索引0,最后一项索引ary.length-1;
console.log(ary[ary.length-1]);//获取最后一项
let ary=[1,2,3,4];
console.dir(ary);
/*
Array(4)
0: 1
1: 2
2: 3
3: 4
length: 4
__proto__: Array(0)
ary={
0:1,
1:2,
2:3,
3:4,
length:4
}
数字作为索引(KEY属性名)
length代表长度
ary[0] 根据索引获取指定项的长度
ary.length 获取数组的长度
ary.length-1 最后一项的索引
*/
扩展思考题:
已知下面代码可以修改BOX元素的样式
box.style.color = 'red';
那么下面的写法是否可以写成修改元素的样式,如果不可以是为什么?
//第一种方案
let AA = box.style;
AA.color = 'red';
//第二种方案
let BB = box.style.color;
BB = 'red';
哪种方式可以实现,不能实现是因为什么?
答:第一种可以实现,因为 element.style 是一个对象指针(引用数据类型的值),AA和box.style是同一个对象指针,所以当AA的值改变的时候,box.style的值也改变了。
第二种 element.style.color 是一个具体的值,是字符串类型(基本数据类型),如果此时box.style.color的值是’pink’,那么这个等式“let BB = box.style.color;”相当于“let BB = “pink”;”
box.style.color = "pink";
let BB = box.style.color;//=>let BB = "pink";
BB = 'red';
BB => 'red'
box.style.color //=> 'pink';
通过document.getElementById方法获取的元素是对象数据类型的值
let box = document.getElementById('box');
console.log(typeof box);//=>'object'
//基于.dir可以看到一个对象的详细信息
/*
id:操作元素的ID值
className:操作元素的CLASS样式类的值
innerHTML:操作的元素的内容(可以识别标签)
innerText:和innerHTML的区别是不能识别标签
tagName:获取元素的标签名(一般大写)
……
style:操作元素的行内样式 属性值是一个新的对象CSSStyleDeclaration
()
*/
console.dir(box)
7. 函数 function
函数就是一个方法或者一个功能体,函数就是把实现某个功能的代码放到一起进行分装,以后想操作实现这个功能,只需要把函数执行即可 => “封装”:减少页面中的冗余代码,提高代码重复使用率(低耦合高内聚)
创建函数
形参
返回值
执行值
实参
arguments
函数底层运行机制
……
创建函数
function [函数名]([形参变量1],...){
//函数体:基于JS完成需要实现的功能
return [处理后的结果];
}
function fnName(){}
调用函数–函数名([实参]);
fnName();
创建函数分析:
function fn(){
var res = null;
res =n+m;
return res;
}
赋值操作:
第一步:创建右边的值;
第二步:创建左边的变量;
第三步:将值和变量关联在一起
var AA = fn(10,20);
console.log(typeof 1);
console.log(1);//控制台输出是有颜色的,黑色是字符串,蓝色是数字
console.log(typeof typeof typeof []);
// typeof 检测出来的都是字符串,所以只要两个及以上同时检测,最后结果必然是“string”
function Person(){};
var p =new Person();
console.log(p instanceof Person);//true
function employee(name, job, born) {
this.name = name;
this.job = job;
this.born = born;
}
var bill = new employee("Bill Gates", "Engineer", 1985);
console.log(bill.constructor === employee);//true
console.log(bill.constructor);//[Function: employee]
/*
输出:
function employee(name, job, born)
{this.name = name; this.job = job; this.born = born;}
*/
第四个:检测数据类型 Object.prototype.toString.call();
Object.prototype.toString.call();//=>"[object Undefined]"
Object.prototype.toString.call();//=>"[object Undefined]"
Object.prototype.toString.call([1,2]);//=>"[object Array]"
Object.prototype.toString.call(null);//=>"[object Null]"
Object.prototype.toString.call(undefined);//=>"[object Undefined]"
Object.prototype.toString.call(12);//=>"[object Number]"
Object.prototype.toString.call('aa');//=>"[object String]"
Object.prototype.toString.call(true);//=>"[object Boolean]"
Object.prototype.toString.call(NaN);//=>"[object Number]"
Object.prototype.toString.call({});//=>"[object Object]"
Object.prototype.toString.call(/ /);//=>"[object RegExp]"
Object.prototype.toString.call(Math);//=>"[object Math]"
Object.prototype.toString.call(Date);//=>"[object Function]"
function fn(){}
Object.prototype.toString.call(fn);//=>"[object Function]"
判断–条件成立做什么?不成立做什么?
if(条件){
条件成立执行
}else if(条件2){
条件2成立执行
}
……
else{
以上条件都不成立执行
}
var obj = {
name: 'dog',
age: 3,
friends: 'Lily,Danny',
1: 100,
2: 120,
3: 150
}
//每一次循环key变量存储的:当前对象的属性名
//获取属性名:obj[属性名] = obj[key]
//obj.key / obj['key']这样写不行,因为obj对象中没有属性名为key的
for (var key in obj) {
console.log('属性名:' + key + '--' + '属性值:' + obj[key])
}
//for in在遍历的时候优先循环数字属性名(从小到大)
/*
输出如下:
属性名:1--属性值:100
属性名:2--属性值:120
属性名:3--属性值:150
属性名:name--属性值:dog
属性名:age--属性值:3
属性名:friends--属性值:Lily,Danny
*/
const array1 = ['a', 'b', 'c'];
for (const element of array1) {
console.log(element);
}
/*
'a'
'b'
'c'
*/
| 欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |