前言
变量 值类型 运算符
1. var
- 变量名必须以英文字母,_,$ 开头
- 变量名可以包括英文字母,_, $, 数字
- 不可以用系统关键字,保留字作为变量名
2. 基本语法
值类型 — 数据类型
- 不可改变的原始值 (栈数据)stack
Number String Boolean undefind null
Number 数字类型 123 45.53 6673, String 字符串 “…” 或 '…’ 写的一段话字符串, Boolean 布尔值 true正1 false 反0,
undefind 未定义 比如var a;没有赋值 变量提升, null 空 最初是用来定义空对象的 , object 对象,- 引用值 (堆数据)heap
array object function引用值和原始值他们的不同是赋值形式
不可改变的原始值(只要写入值不可改变的)
栈stack
var a = 1;//不可改变的原始值
var b = a;
a = 2;//覆盖
console.log(a)//2
堆heap
var arr = [1,2]//引用值创建一个房间存储值
var newArr = arr;//创建一个新的变量数组名共同指向同一个房间
newArr = [3,4]//给新变量名添加新创建房间值
arr.push(5,6)//我们给第一个创建的房间push值,他新创建的房间名共同指向的房间1,2,
console.log(newArr)//3,4
console.log(arr)//1,2,5,6
Boolean 值 true false
var a = Number(false)//0
var b = Number(true);//1
var c = Number(Boolean);//NAN
3. 运算符
- ‘+’ 数学运算 字符串拼接
- 任何数据类型加字符串都等于字符串
-
+
*
/
=
()
- 优先级最弱
=
,优先级最高()
++
--
+=
-=
/=
*=
%=
赋值顺序自右向左,运算自左向右先运算后赋值
var a = 10
var b = ++a -1 + a++
console.log(a , b)//12,21
typeof 判断数据类型
null
var num = null;
console.log(typeof(num))//object
undefind
var num = undefined;
console.log(typeof(num))//undefind
number
var num = 1;
console.log(typeof(num))//number
string
var num = '1';
console.log(typeof(num))//string
javascript独有类型转换隐式类型转换
var num = '2'-'1';
console.log(typeof(num),num)//number 1
var num = 2*'2';
console.log(typeof(num),num)//number 4
显示类型转换
var num = Number('123')
console.log(typeof(num),num)//numkber 123
var demo = null
var num = Number(demo)
console.log(typeof(num),num)//numkber 0
var demo = undefined
var num = Number(demo)
console.log(typeof(num),num)//numkber NaN
var demo = 'string'
var num = Number(demo)
console.log(typeof(num),num)//numkber NaN
number转化
var num = number(false)
console.log(typeof(num),num)//numkber 0
var num = number(true)
console.log(typeof(num),num)//numkber 1
parseInt 不保留小数点 , parseFloat 保留小数点
parselnt() 取值范围是只看数字,不保留小数点
parseFloat()取值范围只看数字,并保留小数点
var num = parseInt('123qwe')
console.log(typeof(num),num)//numkber 123
var num = parseInt(123.9)
console.log(typeof(num),num)//numkber 123
var num = parseFloat(123.9)
console.log(typeof(num),num)//numkber 123.9
var num = parseInt(true) console.log(typeof(num),num)//numkber NaN
var num = parseInt(false)
console.log(typeof(num),num)//numkber NaN
parseInt(形式参数,redix进制)
redix取值范围 2-36 0
var demo = 'a'//以目标进制为基底转化成16进制
var num = parseInt(demo,16)
console.log(typeof(num),num)//numkber 10
var demo = 'b'//以目标进制为基底转化成16进制
var num = parseInt(demo,16)
console.log(typeof(num),num)//numkber 11
null undefind 不能用
toString()
以目标进制为基底转化成10进制
var demo = 123//以redix为基底转化成16进制
var num = demo.toString(8);
console.log(typeof(num),num)//numkber 173
var sum = 10101010;
var sum = parseInt(sum,2)
console.log(typeof(sum),sum)//number 170
== !==
===
类型是否一致
1 == 1
true
1 == '1'
true
1 === '1'
false
1 !== '1'
true
1 !== '1'
true
NaN === NaN
false
undefined
只有在 console.log(typeof(a)) 未定义a不报错
console.log(typeof(typeof(a))) //string
console.log(typeof(a))//undefind
console.log(typeof(undefined))//undefind
console.log(typeof(NaN))//number
console.log(typeof(null))//object
console.log(typeof(NaN))//number
var a = "123abc"
console.log(typeof(+a),a)//number 123abc
console.log(typeof(!!a))//boolean
console.log(typeof(a+''))//string
console.log(1 == '1')//true
console.log(NaN==NaN)//false
console.log(NaN==undefined)//false
console.log('11'+11)//1111 如果 - 0
console.log(1 === '1')//flase
console.log(parseInt('123abc'))//123
var num = 123.123345789
console.log(num.toFixed(3))
函数
命名函数表达式
var test = function theFrstName() {document.write('a')}
document.write(test)
匿名函数表达式
var text = function(){
document.write('b')
}
document.write(text)
参数
function sum (a,b){//形参 占位符
var c = a + b;
console.log(c)
}
sum(1,2)//实参 数值
function sum (a,b){
if(a > 5){
document.write(a+b)
}else if(a<5){
document.write(a-b)
}else{
document.write(10)
}
}
sum(4,2)
判断function 形参 实参 那个多
function tostr(a,b,c,d){
if(tostr.length > tostr.arguments){
console.log('形参')
}else if(tostr < tostr.arguments){
console.log('实参多')
}else{
console.log('相等')
}
}
tostr(1,2,3,4)
函数形参的和
function sum(){
var reult = 0;
for(var a = 0 ; a < arguments.length; a++){
reult += arguments[a]
}
console.log(reult)
}
sum(1,2)
函数判断输入动物返回动物
function max(target){
switch(target){
case "dog":
document.write("狗")
break
case "猫":
document.write("cat")
break
}
}
max('dog')
函数输入数字倒叙汉子输出
var num = window.prompt('input')
function str(){
var result = 0;
for(var a = num.length -1; a >= 0; a--){
result += newStr(num[a])
console.log(result)
}
}
str()
function newStr(target){
switch(target){
case "1" :
document.write('一')
break
case "2" :
document.write('俩')
break
case "3" :
document.write('仨')
break
}
}
递归
找规律找出口
return 公式
n的阶乘
function mul(n){
if(n == 1){
return 1
}
return n * mul(n-1)
}
mul(5)
函数嵌套 b function 可以访问外部 a function 吗? 内部函数可以访问外部函数
a 函数可以访问外部 b 函数吗? 外部函数不可以访问内部函数
越内部函数权限越大可以访问更多外部函数
function test(){
var a = 123;
function demo(){
var b = 456;
document.write(a)
}
document.write(b+' ')
demo()
}
test()
Uncaught ReferenceError: b is not defined
预编译
请问 可以 执行 吗?
function testcase() {
console.log(typeof(typeof(undefined)))//string
}
testcase()
of course
如果我放到 函数最上面 调用 函数名 还可以执行吗?
testcase()
function testcase() {
console.log(typeof(typeof(undefined)))//string
}
same
可以输出吗?
var a = 123;
console.log(a)
of course
Can I output
console.log(b)
var b = 456;
undefind
imply gloabal 暗示全局变量,如果变量未经声明赋值,此变量就为全局对象
如果未经声明直接赋值 默认变量体 给window也就是全局 window就是全局对象 全局域
a = 123;
console.log(a)
window.a = 123;
访问 a
window.a
123
声明的一切全局变量都归window所有
function test() {
var a = 123;
}
test()
console.log(window.a)//undefind
为什么会出现undefind 因为function 它是一个单独的作用域并不是全局所以不归window所有
预编译过程
预编译过程发生在 函数执行前一刻
1.创建AO 对象 作用域执行期上下文
AO{ }
找形参变量声明
,将变量和形参作为AO属性名,值为undefind
将实参值形参统一
在函数体里面找函数声明,赋予函数体
function fn(a){
console.log(a)// f a(){}
var a = 123;
console.log(a)//123
function a(){}
console.log(a)//123
var b = function(){}
console.log(b)//f() {}
function d() {}
}
fn(1)
作用域链精解 立即执行 函数 闭包
[[scope]]:每个javascript函数都是一个对象,对象中有写属性我们可以访问,但有些不可以。有些属性仅供javascrip引擎存取,[[scope]]就是其中一个。[[scope]]指的就是我们所说的作用域,其中存储了运行期上下文集合。
作用域链: [[scope]]中所存储的执行上下文对象的集合,这个集合呈链式链接,我们把这种链式链接叫作用域链。
执行期上下文:当函数执行时,会创建一个称为
执行期上下文
的内部对象 。一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行上下文都是独一无二的,所以多次调用一个函数会导致创建多个执行上下文,当函数执行完毕,它所产生的执行期上下文被销毁。
查找变量: 从作用域链的顶端依次向下查找。