eg. 01_数据类型.html
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>01_数据类型title>
head>
<body>
<script type="text/javascript">
//1. 基本
// typeof返回数据类型的字符串表达
var a
console.log(a, typeof a, typeof a==='undefined',a===undefined ) // undefined 'undefined' true true
console.log(undefined==='undefined')
a = 4
console.log(typeof a==='number')
a = 'atguigu'
console.log(typeof a==='string')
a = true
console.log(typeof a==='boolean')
a = null
console.log(typeof a, a===null) // 'object'
console.log('-----------------')
//2. 对象
var b1 = {
b2: [1, 'abc', console.log],
b3: function () {
console.log('b3')
return function () {
return 'xfzhang'
}
}
}
console.log(b1 instanceof Object, b1 instanceof Array) // true false
console.log(b1.b2 instanceof Array, b1.b2 instanceof Object) // true true
console.log(b1.b3 instanceof Function, b1.b3 instanceof Object) // true true
console.log(typeof b1.b2, '-------') // 'object'
console.log(typeof b1.b3==='function') // true
console.log(typeof b1.b2[2]==='function')
b1.b2[2](4)
console.log(b1.b3()()) // xfzhang
// b3()表示b3的函数
/*var obj = {
name: 'Tom',
age: 12
}
function test () {
var a = 3
}
var arr = [3, 'abc']
arr[1]*/
script>
body>
html>

Q :
eg. 01_数据类型2.html
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>01_相关问题title>
head>
<body>
<script type="text/javascript">
// 实例: 实例对象
// 类型: 类型对象
function Person (name, age) {// 构造函数 类型
this.name = name
this.age = age
}
var p = new Person('tom', 12) // 根据类型创建的实例对象
// Person('jack', 12)
// 1. undefined与null的区别?
var a
console.log(a) // undefined
a = null
console.log(a) // null
//起始
var b = null // 初始赋值为null, 表明将要赋值为对象
//确定对象就赋值
b = ['atguigu', 12]
//最后 释放
b = null // 让b指向的对象成为垃圾对象(被垃圾回收器回收)
// b = 2
var c = function () {
}
console.log(typeof c) // 'function'
script>
body>
html>
1 什么是数据?
2 什么是变量?
3 什么是内存?
4 内存,数据, 变量三者之间的关系
eg. 02_数据_变量_内存.html
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>02_数据_变量_内存title>
head>
<body>
<script type="text/javascript">
var age = 18
console.log(age)
var obj = {name: 'Tom'}
console.log(obj.name)
function fn () {
var obj = {name: 'Tom'}
}
var a = 3
var b = a + 2
script>
body>
html>
分析:
var obj = {name: 'Tom'};
var a = obj;
console.log(obj.name);

问题: var a = xxx, a内存中到底保存的是什么?
* xxx是基本数据, 保存的就是这个数据
* xxx是对象, 保存的是对象的地址值
* xxx是一个变量, 保存的xxx的内存内容(可能是基本数据, 也可能是地址值)
// 保存的是数据
var a = 3
// 保存的是对象的地址值
var a = {}
// 保存的是地址值,函数也是对象
a = function () {}
// 保存的是b 的内容(可能是基本数据,可能是地址值)
var b = 'abc'
a = b // 基本数据
b = {} // 地址值
a = b
(1) 将一个变量赋值给另一个变量是拷贝右边变量的内存内容复制给左边变量
var obj1 = {name: 'Tom'}
var obj2 = obj1 // 将obj1的内存内容保存给obj2,obj1的内存内容就是地址值,但是不要说把obj1的地址值给obj2
obj1.name = 'Jack'
console.log(obj2.name); // 'Jack'
(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) // obj1实参,obj形参,将实参赋值给形参
console.log(obj2.name) //A
(3) 2个引用变量指向同一个对象, 让其中一个引用变量指向另一个对象, 另一引用变量依然指向前一个对象
var a = {age: 12}
var b = a
// a = {} 是语法糖 相当于给a重新找了个对象,现在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) // 12
分析调用函数fn2这块:
首先调用函数, a obj 开始指向同一个对象 age=13
之后 obj = {age : 15} 又创建了一个对象 age=15 obj指向15
a.age还是13,取不到15,15到obj里面了,这是一个垃圾对象,因为函数执行完以后,内部的局部变量就会自动被释放。

问题: 在js调用函数时传递变量参数时, 是值传递还是引用传递
var a = 3
function fn (a) {
a = a + 1
}
fn(a)
console.log(a) // 3
分析:
fn(a) 里面的a就是把3传到函数 var a = 3 a是一个变量,function fn (a)这个里面的a是一个新变量,然后a = a+1,fn(a)里面传递的不是a,是3,等传递完了,就跟a没关系,a=a+1 (这个理解我还没有理解)
别人的理解: a = a+1 左边的a看成局部变量,var a 里面的a是全局变量
function fn2 (obj) {
console.log(obj.name) // Tom
}
var obj = {name: 'Tom'}
fn2(obj)
分析:
首先fn2(obj)调用obj,先读到obj的值,obj的值是地址值,然后把它的地址值赋值给局部变量obj(function fn2 (obj)这个里面的obj)
并不是直接将obj对象传进去,传的是obj的内容,只是它的内容是地址