我只是复制过来学习下怎么编辑掘金博客 1js基础 1-1 声明 「js函数声明三种方式:」
//(1) Function()构造器
var f =new Function()
//(2) 函数声明
function f (){
console.log(2);
}
//(3) 函数表达式
var f = function() {
console.log(1);
}
复制代码
「js变量声明:」
var声明的变量会挂载在window上,而let和const声明的变量不会var声明变量存在变量提升,let和const不存在变量提升(严格来说,let也存在)let和const声明形成块作用域let存在暂存死区const声明必须赋值
(1) var声明的变量会挂载在window上,而let和const声明的变量不会:
var a = 100;
console.log(a,window.a); // 100 100
let b = 10;
console.log(b,window.b); // 10 undefined
const c = 1;
console.log(c,window.c); // 1 undefined
复制代码
(2) var声明变量存在变量提升,let和const不存在变量提升
console.log(a); // undefined ===> a已声明还没赋值,默认得到undefined值
var a = 100;
console.log(b); // 报错:b is not defined ===> 找不到b这个变量
let b = 10;
console.log(c); // 报错:c is not defined ===> 找不到c这个变量
const c = 10;
复制代码
(3) let和const声明形成块作用域
if(1){
var a = 100;
let b = 10;
}
console.log(a); // 100
console.log(b) // 报错:b is not defined ===> 找不到b这个变量
//
if(1){
var a = 100;
const c = 1;
}
console.log(a); // 100
console.log(c) // 报错:c is not defined ===> 找不到c这个变量
复制代码
(4) 同一作用域下let和const不能重复声明,而var可以
var a = 100;
console.log(a); // 100
var a = 10;
console.log(a); // 10
let a = 100;
let a = 10;
// 控制台报错:Identifier 'a' has already been declared ===> 标识符a已经被声明了。
复制代码
(5) 暂存死区
var a = 100;
if(1){
a = 10;
let a = 1;
//在当前块作用域中存在a使用let/const声明的情况下,给a赋值10时,只会在当前作用域查找变量a,
// 而这时,还未到声明时候,所以控制台Error:a is not defined
// 即let 和 const 不会声明提前
}
复制代码
(6) const
一旦声明必须赋值,不能使用null占位。声明后不能再修改如果声明的是引用类型数据,可以修改其属性 const a = 100; const list = []; list[0] = 10; console.log(list); // [10] const obj = {a:100}; obj.name = 'apple'; obj.a = 10000; console.log(obj); // {a:10000,name:'apple'} 复制代码 1-2 数据类型的分类: 基本类型:
string(字符串)--原始类型boolean(布尔值)--原始类型number(数字)--原始类型symbol(符号)--原始类型null(空值)undefined(未定义) BigInt(BigInt数据类型的目的是比Number数据类型支持的范围更大的整数值,精度在(2^53-1)范围内,BigInt(10) 值为:10n) 对象类型(引用类型),有以下3种: A.内置对象/原生对象
String、Number、Boolean、Array、Date、RegExp、Math、 Error、 Object、Function、 Global B.宿主对象
(1)BOM对象: Window、Navigator、Screen、History、Location(2)DOM对象:Document、Body、Button、Canvas等 C.自定义对象--(指由用户创建的对象,兼容性问题需要由编写者注意) 创建自定义对象几种方式:
(1)对象直接量: var obj1 = {}; var obj2 = {x:0,y:0}; var obj3 = {name:‘Mary’,age:18} 复制代码
(2)工厂模式--用函数来封装以特定接口创建对象的细节: function createPerson(name,age,job){ var o = new Object(); o.name = name; o.age = age; o.job = job; return o; } var person1 = createPerson('zhang',30,'java'); 复制代码
(3)构造函数模式: function Person(name,age,job){ this.name= name; this.age = age; this.job = job; } var person1 = new Person('zhang',30,'java'); 复制代码
(4)原型模式: function Person(){} Person.prototype.name = 'zhang'; Person.prototype.age = '22'; Person.prototype.job = 'html5'; var person1 = new Person(); 复制代码 1-3 数据类型的判断: typeof:
一般通过 typeof 操作符来判断一个值属于哪种基本类型。缺点:无法分辨对象类型 typeof 'seymoe' // 'string' typeof true // 'boolean' typeof 10 // 'number' typeof Symbol() // 'symbol' typeof null // 'object' 无法判定是否为 null typeof undefined // 'undefined' 复制代码 typeof {} // 'object' typeof [] // 'object' typeof(() => {}) // 'function' 复制代码 「为什么typeof null为object:」 js 在底层存储变量的时候,会在变量的机器码的低位1-3位存储其类型信息
000:对象010:浮点数100:字符串110: 布尔值1:整数 但是, 对于 undefined 和 null 来说,这两个值的信息存储是有点特殊的。
null:所有机器码均为0undefined:用 −2^30 整数来表示 所以,typeof 在判断 null 的时候就出现问题了,由于null 的所有机器码均为0,因此直接被当做了对象来看待。 instanceof:
判断对象类型:测试构造函数的 prototype 是否出现在被检测对象的原型链上。缺点:无法判断一个值到底属于数组还是普通对象 [] instanceof Array // true ({}) instanceof Object // true (()=>{}) instanceof Function // true 复制代码 let arr = [] let obj = {} arr instanceof Array // true arr instanceof Object // true obj instanceof Object // true 在这个例子中,arr 数组相当于 new Array() 出的一个实例, 所以 arr.proto === Array.prototype, 又因为 Array 属于 Object 子类型, 即 Array.prototype.proto === Object.prototype, 所以 Object 构造函数在 arr 的原型链上 // //判断不了原始类型 console.log(true instanceof Boolean);// false console.log(undefined instanceof Object); // false console.log(arr instanceof Array); // true console.log(null instanceof Object); // false console.log({} instanceof Object); // true console.log(function(){} instanceof Function);// true 复制代码 Object.prototype.toString.call(): Object.prototype.toString.call({})// '[object Object]' Object.prototype.toString.call([])// '[object Array]' Object.prototype.toString.call(() => {})// '[object Function]' Object.prototype.toString.call('abc')// '[object String]' 复制代码
传入原始类型却能够判定出结果是因为对值进行了包装。 「那么,什么是包装对象:」 所谓“包装对象”,指的是与数值、字符串、布尔值分别相对应的Number、String、Boolean三个原生对象。这三个原生对象可以把原始类型的值变成(包装成)对象。
作者:子树 链接:juejin.cn/post/684490… 来源:掘金 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。