这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
数据类型
基本类型
| Number | String | Boolean | undefined | null |
|---|---|---|---|---|
| 任意数值 | 任意字符串 | true/false | undefined | null |
| typeof | typeof | typeof | typeof/=== | === |
对象(引用)类型
| Object | Array | Function |
|---|---|---|
| 任意对象 | 特别对象(内部数据有序/数据下标) | 特别的对象(可以执行) |
| typeof/instanceof | instanceof | typeof |
注意:typeof不能区别的类型:null与Object,Object和Array
相关问题
- undefined与null的区别?
- undefined代表定义未赋值
- nulll定义并赋值了, 只是值为null
- 什么时候给变量赋值为null呢?
- 初始赋值, 表明将要赋值为对象\
- 结束前, 让对象成为垃圾对象(被垃圾回收器回收)
- 严格区别变量类型与数据类型?
-
js的变量本身是没有类型的, 变量的类型实际上是变量内存中数据的类型
-
变量类型:
- 基本类型: 保存基本类型数据的变量
- 引用类型: 保存对象地址值的变量
-
数据对象 基本类型:保存就是基本类型的数据 对象类型:保存的是地址值
数据,变量与内存
什么是数据
在内存中可读的, 可传递的保存了特定信息的'东东'
一切皆数据, 函数也是数据
在内存中的所有操作的目标: 数据
包括(算术运算,逻辑运算、 赋值、运行函数)
什么是变量?
在程序运行过程中它的值是允许改变的量
一个变量对应一块小内存, 它的值保存在此内存中
什么是内存?
内存条通电后产生的存储空间(临时的)
一块内存包含2个方面的数据
- 内部存储的数据
- 地址值数据
内存空间的分类
- 栈空间: 全局变量和局部变量
- 堆空间: 对象
内存,数据, 变量三者之间的关系
- 内存是容器, 用来存储不同数据
- 变量是内存的标识, 通过变量我们可以操作(读/写)内存中的数据
相关问题
1.关于赋值与内存的问题
var a = xxx, a内存中到底保存的是什么?
xxx是基本数据, 保存的就是这个数据
xxx是对象, 保存的是对象的地址值
xxx是一个变量, 保存的xxx的内存内容(可能是基本数据, 也可能是地址值)
2.关于引用变量赋值问题
2个引用变量指向同一个对象, 通过一个变量修改对象内部数据, 另一个变量看到的是修改之后的数据
2个引用变量指向同一个对象, 让其中一个引用变量指向另一个对象, 另一引用变量依然指向前一个对象
var obj1 = {name: 'Tom'}
var obj2 = obj1
obj2.age = 12
console.log(obj1.age) // 12
function fn (obj) {
obj.name = 'A'
}
fn(obj1)
console.log(obj2.name) //A
var a = {age: 12}
var b = a
a = {name: 'BOB', age: 13}
b.age = 14
console.log(b.age, a.name, a.age) // 14 Bob 13
function fn2 (obj) {
obj = {age: 15}
}
fn2(a)
console.log(a.age) //13
3.关于数据传递问题
在js调用函数时传递变量参数时, 是值传递还是引用传递
理解1: 都是值(基本/地址值)传递
理解2: 可能是值传递, 也可能是引用传递(地址值)
var a = 3
function fn (a) {
a = a +1
}
fn(a)
console.log(a) //3
function fn2 (obj) {
console.log(obj.name) //tom
}
var obj = {name: 'Tom'}
fn2(obj)
4.JS引擎如何管理内存
- 内存生命周期
- 分配小内存空间, 得到它的使用权
- 存储数据, 可以反复进行操作
- 释放小内存空间
- 释放内存
- 局部变量: 函数执行完自动释放
- 对象: 成为垃圾对象==>垃圾回收器2回收
var a = 3
var obj = {}
obj = undefined
function fn () {
var b = {}
}
fn() //b是自动释放, b所指向的对象是在后面的某个时刻由垃圾回收器回收
对象
什么是对象?
多个数据的封装体
用来保存多个数据的容器
一个对象代表现实中的一个事物
为什么要用对象?
统一管理多个数据
对象的组成
属性: 属性名(字符串)和属性值(任意)组成
方法: 一种特别的属性(属性值是函数)
如何访问对象内部数据?
属性名: 编码简单, 有时不能用
['属性名']: 编码麻烦, 能通用
问题: 什么时候必须使用['属性名']的方式?
属性名包含特殊字符: - 空格
属性名不确定
var p = {}
//1. 给p对象添加一个属性: content type: text/json
// p.content-type = 'text/json' //不能用
p['content-type'] = 'text/json'
console.log(p['content-type'])
//2. 属性名不确定
var propName = 'myAge'
var value = 18
// p.propName = value //不能用
p[propName] = value
console.log(p[propName])
函数
什么是函数
实现特定功能的n条语句的封装体
只有函数是可以执行的, 其它类型的数据不能执行
如何定义函数?
函数声明、表达式
如何调用(执行)函数
test() 直接调用
obj.test() 通过对象调用
new test() new调用
test.call()/apply(obj) 通过临时让test成为obj的方法调用
定义函数
function fn1 () { //函数声明
console.log('fn1()')
}
var fn2 = function () { //表达式
console.log('fn2()')
}
fn1()
fn2() //直接调用
var obj = {}
function test2 () {
this.xxx = '你好'
}
// obj.test2() 不能直接, 根本就没有
test2.call(obj) //或者test2.apply(obj) //可以让一个函数成为指定任意对象的方法进行调用
console.log(obj.xxx) //输出你好
回调函数
什么是回调函数
- 你定义的
- 你没有调
- 但是他最终执行了(在某个条件下或者某个时刻)
常见的回调函数
- dom事件回调函数 ==>发生事件的dom元素
- 定时器回调函数 ==>window
- ajax请求回调函数
- 生命周期回调函数
// dom事件回调函数
document.getElementById('btn').onclick = function () {
alert(this.innerHTML)
}
// 定时器回调函数
setTimeout(function () {
alert('到点了'+this)
}, 2000)
匿名函数自调用
- 隐藏实现
- 不会污染外部(全局)命名空间
- 用它来编码js模块
(function () { //匿名函数自调用
var a = 3
console.log(a + 3)
})()
var a = 4
console.log(a)
;(function () { //注意这里是小括号前面加了;
var a = 1
function test () {
console.log(++a)
}
window.$ = function () { // 向外暴露一个全局函数
return {
test: test
}
}
})()
$().test() // 1. $是一个函数 2. $执行后返回的是一个对象
函数中的this
this是什么
任何函数本质上都是通过某个对象来调用的,如果没有直接指定就是window
所有函数内部都有一个变量this
它的值是调用函数的当前对象
如何确定this的值?
test(): --------window
p.test():-------p
new test():----新创建的对象
p.call(obj):----obj
function Person(color) {
console.log(this)
this.color = color;
this.getColor = function () {
console.log(this)
return this.color;
};
this.setColor = function (color) {
console.log(this)
this.color = color;
};
}
Person("red"); //this是谁? window
var p = new Person("yello"); //this是谁? p
p.getColor(); //this是谁? p
var obj = {};
p.setColor.call(obj, "black"); //this是谁? obj
var test = p.setColor;
test(); //this是谁? window
function fun1() {
function fun2() {
console.log(this);
}
fun2(); //this是谁? window
}
fun1();
最后
本文作为本人学习总结之用,同时分享给大家
因为个人技术有限,如果有发现错误或存在疑问之处,欢迎指出或指点!不胜感谢!