JS基础(二)

108 阅读9分钟

普通对象

  • 由大括号包裹起来的{key:value} 属性是用来描述对象特征的 属性值 是特征的描述

对象的声明

var one = {
    name:zhangsan,
    age:12,
    ary:[12,13,14]
}

对象属性操作

  1. 获取对象的属性值 属性名为数字时 只能用第二种方式获取
    • 对象.属性名
    • 对象['属性名']
  • 返回属性名对应的属性值 不存在返回undefined
  1. 增加或者修改属性名 具有唯一性
    • 这个属性名之前在对象中存在(修改)就是修改属性值
    • 若这个属性名之前不存在(增加) 就是增加一个键值对
  2. 删除对象的属性
    • 软删除 将属性值改为null属性名还存在
    • 彻底删除 delete 对象.属性名/对象['属性名'] 删除后 属性名属性值都不存在
var a = {
    name:qqq,
    age:13;
    play:['hehhe','hahha']
}
console.log(a.name) //获取
a.age = 11; //修改
a.all = 'nanan' //增加
a.age = null; //删除
delete a.name //删除

数组操作

数组是有序的键值对 顺序不能随意调整 键是浏览器自动分配的 从零开始第n项的键 是 n-1 我们一般称为索引 我们操作的都是值 长度为length - 1

  • 操作数组只能用方括号的方式获取、修改 不存在时返回undefined
var a = [1,2,3]
console.log(ary[0]); //获取
console.log(ary.length); //获取数组长度
ary[1] = 12; //修改
ary[3] = 13; //增加

基本数据类型和引用数据类型的区别?

  • 基本数据类型操作的是值类型的操作 就是说变量真的就是这个本身
  • 引用数据类型 操作的不是值的本身 而是这个引用数据类型存储的堆内存空间地址 具有唯一的地址 因此在声明变量时 引用数据类型将变量存储在堆内存空间 最后代表的值是这内存空间地址

布尔类型 只有两个值 true/false 通常配合条件语句使用

  1. 将其它类型的值 转换成布尔值 Boolean(需要转变的值) /!![]
    • 数字转换成布尔值 只有空字符串转换成布尔值是false 其余都是true
    • 字符串转换成布尔值 只有空字符串转换成布尔值 是 false 其余都是true
    • null 转换成布尔值 false
    • undefined 转换成布尔值 false
    • Symbol() true
    • 引用数据类型转换成布尔值 都是true 除了 0 NaN '' null undefined 其他都是true

算法

  1. if(条件){ 浏览器会对条件进行布尔运算 true 执行的语句 }else{ false 执行的语句 } if(){

}else if(){

}else{

}

  1. 三元运算符 条件 ? ‘对执行’ : ‘错执行’
  2. switch(值 值要绝对比较){ case: break; ... default: break }
  • == 相对比较 不比较类型 只比较值 值相同返回true
  • ===绝对比较 不仅值要相同 类型也要相同
  • 若条件中有一个数学表达式 先进行计算

null 和 undefined 的区别

  1. 首先null和undefined是两种不同类型
  2. typeof null -> "object" 因为null空对象指针;typeof undefined -> "undefined"
  3. 访问对象、数组不存在的键或者索引返回undefined
  4. Number(null) -> 0 Number(undefined) -> NaN

逻辑运算符

  1. || 或逻辑 两者只要有一个为true 就是true
  2. && 且逻辑 两者都是true 才会返回true

逻辑运算符的赋值属性

  1. || 赋值属性 哪一个是true 就返回哪一个
  2. && 赋值属性 哪一个是false 就返回哪一个

== 和 === 的区别

  1. 数字 == 字符串 字符串转换成数字 然后再比较
console.log(1 == '1')  //true
console.log(1 == 'abc')  //false
  1. 数字 == 布尔值 把布尔值转换成数字 再进行比较
console.log(1 == true) //false
console.log(1 == false) //false
  1. 布尔值 == 字符串 把布尔值和字符串 都转换成数字 再比较
console.log(true == '1') //true
console.log(false == '') //true
  1. nul == undefined // true null undefined 和其它数据类型比较都是false
  2. 对象 == 对象 比较的是堆内存空间 若对内存的地址相同 就返回true
var obj = {
    name:'wang',
    age = 12
}
var a = obj;
console.log(obj == a) //true
  1. 对象 == 字符串 对象调用 toString() 转成字符串 然后再和字符串比较
console.log({} == '') //false ({}).toString() -> '[object Object]'
  • 普通对象 ({}).toString() -> '[object Object]'
  • 数组 ([]).toString() 就是将方括号会转成引号 内容和数组项相同
  1. 对象== 布尔值 将对象先转成字符串 然后再转成数字 布尔值也转成数字 再比较
console.log({} == true); // false

  1. 对象 == 数字 对象想转成字符串 再转成数字 再比较
  2. NaN == NaN false
  • 基本数据类型比较 值和类型都相同 返回true
  • 引用数据类型比较 地址相同 返回true

for 循环

for(初始值;判断条件;变化规律){
    循环体
}

步骤:

  • 设置循环初始值
  • 判断循环条件是否成立 若成立 向下执行 若不成立退出循环
  • 执行完循环体 累加
  • 累加过后判断是否满足条件 若成立 执行循环体 不成立退出循环
  • 直到不满足循环条件 退出整个循环 生命的初始值和累加 可以不写在小括号里
倒着输出
var ary = [1,2,3,4,5,6,7,8];
for(var i = ary.length -1 ; i >= 0 ; i--){
    console.log(ary[i]);
}

输出奇数项
for(var i = 0; i < ary.length ; i++){
    if(i%2 === 0){
        console.log(ary[i])
    }
}

遍历 把所有集合每个元素都取出一次叫做一次遍历

for in 循环 用来遍历普通对象

var obj = {
    name: 'zhangsan',
    age:10,
    teacher:'admin'
}
console.log(obj);
for(var key in obj){
    key 是每次循环对象的一个键 对象有多少个键 就执行多少回
    console.log(key);
    console.log(obj[key]);  //每次循环时对象的值
}

break 和 continue 的区别

  • continue 结束本次循环
  • break 退出整个循环

获取DOM对象

DOM对象 通过js 的相关 和 HTML方法获取到的HTML文档中的元素

  • 通过ID获取页面中的元素对象 语法 document.getElementById('id名') 返回值 若获取到 就是元素ID 是指定ID的DOM元素对象 若获取不到返回null 注意:
    1. document 是查找上下文,document是整篇html文档,而且getElementById查找的上下文只能是document
    2. DOM对象的属性
  • className: html元素的class名
  • id: html元素的id名
  • innerHTML: 以字符串形式存在的这个元素包裹的html标签
  • innerText: html元素包含的文本内容
  • onclick: html元素的点击事件属性
  • onmouseover: 鼠标滑过事件
  • onmouseout: 鼠标离开事件
  • style: html元素的行内样式
  • getElementByTagName() 通过标签名获取元素对象集合 DOM对象也都是对象 可以像操作对象的方式一样操作DOM对象

隔行变色

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>隔行变色</title>
    <style>
       *{
           margin: 0;
           padding: 0;
       } 
       ul,li{
           list-style: none;
       }
    .liwrapper{
        margin: 30px auto;
        border: 1px solid orangered;
        width: 500px;
    }
    .liwrapper li{
        height: 50px;
        line-height: 50px;
        text-align: center;
        border-bottom: 1px darkkhaki dashed;
    }
    </style>
</head>
<body>
    <ul  id = 'wrapper' class="liwrapper">
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
        <li>7</li>
        <li>8</li>
    </ul>
</body>
</html>
<script>
var liWrapper = document.getElementById('wrapper');
var liList = liWrapper.getElementsByTagName('li');
for(var i = 0 ; i < liList.length ; i++){
//     if (i % 2 === 0) {
//     // 如果是 i 是偶数
//     liList[i].style.backgroundColor = 'pink';
//   } else {
//     // 否则 i 是奇数
//     liList[i].style.backgroundColor = 'yellow';
//   }
i%2 === 0 ? liList[i].style.backgroundColor = 'pink' : liList[i].style.backgroundColor = 'orange';
}
</script>

函数

在计算机语言中 函数是拥有固定功能和逻辑的代码块 只需声明一次 就可无限执行 面向对象(OOP Object-Oriented-Programming)的语言也叫做方法

function fn(){
    console.log(a);
}
fn();
fn();
fn(); 
//输出a a a

语法

  1. 函数声明部分
    • function 声明函数
    • fn 叫函数名
    • (a,b)叫形参入口
    • {功能 和逻辑代码}
  2. 函数执行部分 声明后不会执行 需要函数执行 才能执行函数体里的代码 -函数名(实参)实参是非必需的
    • 函数可以执行多次 每次执行都互不影响
    • 函数名() 这个表达式还表示函数执行后留下的结果
function sum(a,b){
    var total = 0;
    total = a + b;
    console.log(total);
}
sum(1,2); //3

形参和实参 一一对应

 function sum(a, b) {
 	var total = 0;
	total = a + b;
 	console.log(total)
 }

 var result = sum(1, 2);
 console.log(result) // undefined
 console.log(total); // Uncaught ReferenceError: ...

 引发报错的原因:total是在函数体内部声明的变量,这种声明在函数体内部的变量称为私有变量,而私有变量在函数外部是无法访问的,这是由于闭包机制导致的。
 修改后:
   function sum(a, b) {
  var total = 0;
  total = a + b;
  return total;
}

var result = sum(1, 2);
console.log(result); // 3
console.log(sum(1, 2)); 
  • return 用于指定函数返回值 return啥函数就返回啥
  • 若函数内部没有return 或者return后面什么也没写 那么函数的返回值是undefined
  • return 关键字还有一个重要的作用 可以强制接收return 后面的代码
  • return 永远返回一个值 若是一个表达式 return或等表达式求值完成后 再返回值

选项卡

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>选项卡</title>
    <style>
    * {
      margin: 0;
      padding: 0;
    }
    ul, li {
      list-style: none;
    }
    .wrapper {
      margin: 30px auto;
      width: 800px;
    }

    .header {
      width: 602px;
      border: 1px solid #000;
    }
    .header:after {
      display: block;
      content: '';
      visibility: hidden;
      clear: both;
    }
    .header li {
      float: left;
      width: 200px;
      height: 40px;
      line-height: 40px;
      text-align: center;
      font-size: 18px;
      cursor: pointer;
    }
    .header li.active {
      background: yellow;
    }
    .header li:nth-child(2) {
      border-left: 1px solid #000;
      border-right: 1px solid #000;
    }

    .wrapper div {
      display: none;
      height: 200px;
      width: 602px;
      border: 1px solid #000;
      line-height: 200px;
      text-align: center;
      font-size: 20px;
    }
    .wrapper div.active {
      display: block;
    }
    </style>
</head>
<body>
    <div id="wrapper" class="wrapper">
        <ul id="header" class="header">
            <li class="active">新闻</li>
            <li>时尚</li>
            <li>机车</li>
        </ul>
        <div class="active">新闻</div>
        <div>时尚</div>
        <div>机车</div>
    </div>
</body>
</html>
<script>
var wrapper = document.getElementById('wrapper');
var header = document.getElementById('header');
var tabList = header.getElementsByTagName('li');
var divList = wrapper.getElementsByTagName('div');


for (var i = 0; i < tabList.length; i++) {
  tabList[i].myIndex = i;
  tabList[i].onclick = function () {
    for (var j = 0; j < tabList.length; j++) {
      tabList[j].className = '';
      divList[j].className = '';
    }
    var myIndex = this.myIndex;
    tabList[myIndex].className = 'active';
    divList[myIndex].className = 'active';
  }
}

</script>