♣♠JavaScript

前言


变量 值类型 运算符

1. var

  1. 变量名必须以英文字母,_,$ 开头
  2. 变量名可以包括英文字母,_, $, 数字
  3. 不可以用系统关键字,保留字作为变量名

2. 基本语法

值类型 — 数据类型

  1. 不可改变的原始值 (栈数据)stack
    Number String Boolean undefind null
    Number 数字类型 123 45.53 6673, String 字符串 “…” 或 '…’ 写的一段话字符串, Boolean 布尔值 true正1 false 反0,
    undefind 未定义 比如var a;没有赋值 变量提升, null 空 最初是用来定义空对象的 , object 对象,
  2. 引用值 (堆数据)heap
    array object function
  3. 引用值和原始值他们的不同是赋值形式 不可改变的原始值(只要写入值不可改变的)

栈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. 运算符

  1. ‘+’ 数学运算 字符串拼接
  2. 任何数据类型加字符串都等于字符串
  3. - + * / = ()
  4. 优先级最弱= ,优先级最高()
  5. ++ -- += -= /= *= %=
    赋值顺序自右向左,运算自左向右先运算后赋值
  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]]中所存储的执行上下文对象的集合,这个集合呈链式链接,我们把这种链式链接叫作用域链。

执行期上下文:当函数执行时,会创建一个称为 执行期上下文 的内部对象 。一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行上下文都是独一无二的,所以多次调用一个函数会导致创建多个执行上下文,当函数执行完毕,它所产生的执行期上下文被销毁。
查找变量: 从作用域链的顶端依次向下查找。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值