资讯专栏INFORMATION COLUMN

JS简明基础

zhigoo / 458人阅读

摘要:数据类型在最新的规范中,定义了种数据类型不了解其中前种为基础数据类型,只有为引用类型基础数据类型和引用类型划分的依据是其在内存中存储的形式基础数据类型在内存对应的位置存储的是,,字符串,数值或布尔值引用类型在内存对应的位置存储的是地址通过操

数据类型

在最新的 ECMAScript 规范中,定义了7种数据类型

null

undefined

boolean

number

string

symbol(不了解)

object

其中前6种为基础数据类型,只有 object 为引用类型

基础数据类型和引用类型划分的依据是其在内存中存储的形式

基础数据类型在内存对应的位置存储的是null,undefined,字符串,数值或布尔值(symbol)

引用类型在内存对应的位置存储的是地址

通过操作符 typeof 判断数据类型,不过有以下例外

typeof null // "object"
typeof function(){} // "function"

通过操作符 instanceof 判断对象的类型

The instanceof operator tests whether the prototype property of a constructor appears anywhere in the prototype chain of an object.

只要该对象的原型链上有以该构造函数生成的对象,就返回true

[] instanceof Object // true
[] instanceof Array // true
[] instanceof Date // false
函数与对象
typeof function(){} // "function"

函数也是对象

对象大都是通过函数new出来,不考虑函数对象

var obj = { a: 10, b: 20 }; // 将看成是一种语法糖
// 相当于
var obj = new Object();
obj.a = 10;
obj.b = 20;

var arr = [5, "x", true];
// 相当于
var arr = new Array();
arr[0] = 5;
arr[1] = "x";
arr[2] = true;

函数Fn也是对象,具有属性prototype,其指向一个对象P,通过new Fn()产生的对象fn,fn.__proto === Fn.prototype,Fn.prototype === P

Returns a reference to the Object constructor function that created the instance object.

对象通过 constructor 找到生母是谁

function Fn() { }
let fn = new Fn()
Fn.constructor === Function // true
fn.constructor === Fn // true

.png)

通过 hasOwnPrototype ,判断某属性是对象自身拥有的,还是其原型链上的

函数 内部变量声明&提升

函数在执行之前会搜索函数体内所有的函数声明,将其移至函数体的开始

函数在执行之前会搜索函数体内所有通过 var 声明的变量,将其移至函数体的开始

移至函数声明的后面

只声明变量,并不给变量赋值或赋值为undefined,赋值的操作,仍在原地

console.log(Person) // function Person(){}
function Person(){
}
var Person = 2
console.log(Person) // 2
console.log(Person) // function Person(){}
var Person = 2
function Person(){
}
Person // 2
// 相当于
console.log(Person)
function Person(){
}
var Person
Person = 2
参数
var v1 = {}
function func(obj){
  obj = {
    name: "v1"
  }
}
func(v1)
// 相当于
func(v1)
function func(obj){
  let obj = v1
  obj = {
    name: "v1"
  }
}

函数中传递参数,相当于额外执行了let parameter = argument,在函数体内声明变量名为形参的局部变量,并且值为实参

this

函数内部this指向的对象取决于函数被调用的情形。

通过 new 操作符调用函数且函数没有明确的返回值时,this指向函数将要创建的对象

函数被当作对象的属性调用,this指向调用该函数的对象

通过call,apply,bind显示地给函数绑定调用对象

找不到对象的话就是宿主环境(window)

作用域

函数可以通过参数获得额外的变量,

函数也可以通过this对象来获得额外的变量,

函数还可以通过作用域获得额外的变量

相比于this对象,动态地获得额外的变量;通过作用域获得的额外的变量是在函数书写的时候就确定了,静态作用域

let x = 10;
function foo() {
  console.log(x);
}
function bar(funArg) {
  let x = 20;
  funArg(); // 10
}
bar(foo);

函数在执行时,其上下文是基于它书写的地方

闭包

1  function foo() {
2     var a = 2;
3
4     function bar() {
5         console.log( a );
6     }
7
8     return bar;
9  }
10
11  var baz = foo();
12
13  baz(); // 2

a 是 foo() 内部的变量,不能在函数外部被直接访问

bar 可以访问 foo() 内部所有的变量,包括 a

bar 被作为返回值,返回给了外部变量 baz,因此通过 baz 可以访问 foo() 内部的变量,包括 a

bar 内部包裹着一段代码 console.log(a) ,虽然它在第13行,通过 baz 来调用,但实际上它执行时的上下文仍是第5行的上下文

Closure is when a function is able to remember and access its lexical scope even when that function is executing outside its lexical scope.

闭包的本质是作用域

本来,当 foo() 执行完后,这个作用域及其内部的变量就被回收了,但是

bar() still has a reference to that scope, and that reference is called closure.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/92555.html

相关文章

  • java回调函数-异步回调-简明讲解

    摘要:回调函数异步回调简明讲解叙言异步回调常用于某些业务需要很长时间处理,但是又需要立刻返回结果,这种情况都需要开辟线程独立处理需要长时间多的业务,也无处理完了,回调回调函数,再去处理与之有关的需要在该业务之后处理的业务。 java回调函数-异步回调-简明讲解 叙言: 异步回调常用于某些业务需要很长时间处理,但是又需要立刻返回结果,这种情况都需要开辟线程独立处理需要长时间多的业务,也无处理...

    Simon_Zhou 评论0 收藏0
  • 简明 PHP 教程》04 基础

    摘要:逻辑行与物理行所谓物理行是你在编写程序时你所看到的内容。以作为不同逻辑行的结束与分隔。在逻辑行的开头留下空白区使用空格或制表符用以确定各逻辑行的缩进级别,而后者又可用于确定语句的分组。每一组这样的语句被称为块。 只是打印出 hello world 肯定是不够的,是吗?你会希望做得比这还要多——你想要输入一些内容,操纵它,然后从中得到一些输出出来的内容。我们可以在 PHP 中通过使用变量...

    Yu_Huang 评论0 收藏0
  • Python入门资料大全(更新ing)

    摘要:在线挑战,还没用过,貌似现在对英文资料心里还有种抵触,必须克服实验楼研发工程师包含了等学习课程。书的作者就是开发了用于数据分析的著名开源库的作者英文资料,对数据分析中要用到的一些库,等等做了简要介绍。形式的资料,示例代码都很全。 showImg(https://segmentfault.com/img/remote/1460000004852849); 一、说明 面对网络上纷繁复杂的资...

    wuaiqiu 评论0 收藏0
  • 简明docker教程

    摘要:并且各种各样的货物被集装箱标准化了,集装箱和集装箱之间不会互相影响。容器可以被创建启动停止删除暂停等。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动。这是指用镜像为基础来启动容器。 简明docker教程 一、什么是docker 二、docker与虚拟机比较 三、安装docker 四、基本概念 1、镜像 2、容器 3、数据卷 4、挂载 五、参考资料 有收...

    FuisonDesign 评论0 收藏0
  • Python3 简明教程

    摘要:课程简介简明易懂的课程,不仅适用于那些有其它语言基础的同学,对没有编程经验的同学也非常友好。建议遵守以下约定使用个空格来缩进永远不要混用空格和制表符在函数之间空一行在类之间空两行字典,列表,元组以及参数列表中,在后添加一个空格。 showImg(https://segmentfault.com/img/bVCldE); 课程简介:简明易懂的 Python3 课程,不仅适用于那些有其它语...

    cyqian 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<