JS第一天、数据类型检测、内存释放

news2024/10/6 6:43:48

复习:

以下类型都是 object

console.log(typeof new Object);
console.log(typeof new Array());
console.log(typeof new Date());
console.log(typeof new RegExp());
console.log(typeof new String());
console.log(typeof new Number());
console.log(typeof new Boolean());
console.log(typeof Math); // 就是一个对象 不能new

// 函数的类型是 function
console.log(typeof new Function());//function

typeof 6种类型 number string boolean undefined object function

in 运算符

作用:判断指定的属性是否存在于被检测的对象中(含自身属性和原型属性,无论普通 / 不可枚举 / 原型)
语法: key in obj

var obj = {
	"name": "chuanchuan",
	"age": 19, 
	"gender": "male"
};
// 遍历对象
for(var k in obj) {
	console.log("key = " + k + ", v = " + obj[k]);//这里不能写obj.k;
}
console.log("age" in obj);// true
console.log("toString" in obj); // true   toString 是继承来的

var arr = [1, 0];
// 对数组来说,索引就是数组的属性
console.log(2 in arr); // false  0和1在  2就不在了

// 判断是否存在属性的方法:
// 1 in
// var obj = {};
// console.log("age" in obj);

// 2 if
if(obj.age) {
	// 如果有 。。。。
} else {
	// 没有。。。
}

面试题

// 判断两个对象是否相等
console.log({} === {});	 // false
console.log({} == {});   // false

console.log("1" == 1);   // true
console.log("1" === 1);  // false

// 值类型(简单类型)
// 如果存储的是数据本身,那么就是值类型5种
// 包括:string / number /boolean / null / undefined
// 引用类型(复杂类型)
// 如果存储的是数据的引用(地址),那么就是引用类型9种
// 包括:Object Function Array Date Math RegExp String Number Boolean

1. 为对象定义方法的两种方式

Product.prototype.buy=function(){};

Product.prototype={
	buy:function(){}
}

2. 用构造函数创建属性的四种方式

/*传参形式*/
function Product(name){
    this.name = name
}
Product.prototype={}
var iphone = new Product('iphone8s')

/*默认值*/
function Product(){
    this.name = ''
    this.price=0
}
Product.prototype={}

var iphone = new Product()
/*动态添加形式*/
iphone.description='XXXXXXXXXX'
iphone.images=[]

/*混合模式*/
function Product(name,price){
    this.name = name
    this.price=price
    this.version=1.0
    this.add=function(){}
}
Product.prototype={}

3. instanceof; A instanceof B 检测构造函数B的原型属性在不在A的原型链上

在这里插入图片描述

4. 两个面试题

var fun1 = function(){
        this.name = 'peter';
        return {
            name: 'jack'
        };
    }
    var p1 = new fun1();
    console.log(p1.name)// jackvar fun2 = function(){
        this.name = 'peter';
        return 'jack';
    }
    var p2 = new fun2();
    console.log(p2.name)//petervar o = new Object();
// 2 创建一个函数
function foo(obj) {
    obj.name = "腐女";
    
    obj = new Object();
    obj.name = "屌丝";
}
// 3 调用函数
foo(o);
console.log(o.name); //腐女

5. 函数声明和函数表达式的区别

 var str =''
    var num=1
    var bool=true
    var date = new Date()
    console.log(fn())  //21行输出函数  本行输出undefined
    console.log(fn2())// 报错 Uncaught TypeError: fn2 is not a function

    //函数声明,变量fn以及其实现被提升到顶部
    function fn(){
        console.log('函数')  //第21行
    }
    //函数表达式,仅变量fn2被提升到顶部,实现没有被提升
    var fn2 = function(){
        console.log('函数变量形式')
    }

6. 属性的get和set

function Product(name,price) {
        /*属性 行为 可以为空或者给默认值*/
        this.name=name
        this.price=1000;
        this.description = '';
        this.zhekou = ''
        this.sales = ''
        this.produceDate
       //固定写法 写在构造函数内部  Object.defineProperty(this, "属性名", fn)
        Object.defineProperty(this, "price", {
            value:5000000,
            writable: false,  //设置属性是否可写
        });
        Object.defineProperty(this, "produceDate", {
            get: function () {
                return dateFormat(produceDate,'yyyy年MM月dd日');
            },
            set: function (value) {
                produceDate = value;
            }
        });
    }

7.公有属性 私有属性

function Person(name) {
        //私有属性,只能在对象构造函数内部使用
        var className = "用户对象";
        //公有属性,在对象实例化后调用
        this.name = name;
        //私有方法
        var privateFunction = function () {
            alert(this.name);
        }
        //公有方法
        this.publicFunction = function () {
            alert(this.name); //公有属性
            alert(className); //正确 直接通过变量名访问
            alert(this.className); //undefined 错误 不能这样访问
        }
        //公有属性
        alert(className);
        //正确 直接通过变量名访问
        alert(this.className); //undefined 错误 不能这样访问
    }

8. 数据类型检测的方法

① typeOf(); 在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 “object”。
在这里插入图片描述

console.log(typeof undefined)//'undefined'
console.log(typeof null) //object  未知bug
console.log(typeof true) //'boolean'
console.log(typeof 123)  //'number'
console.log(typeof "abc")  //'string'
console.log(typeof function() {}) //'function'
var arr=[];
console.log(typeof {}) //'object'
console.log(typeof arr)//'object'
console.log(typeof unknownVariable) //'undefined'

②call方法 Object.prototype.toString.call()

console.log(toString.call(123))   // "[object Number]"
console.log(toString.call('123'))  //"[object String]"
console.log(toString.call(undefined))  //"[object Undefined]"
console.log(toString.call(true))  //"[object Boolean]"
console.log(toString.call({}))  //"[object Object]"
console.log(toString.call([]))  //"[object Array]"
console.log(toString.call(function(){}))  //"[object Function]"

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
③ instanceof

var arr = new Array()
console.log(arr instanceof Array)     //---------------> true
console.log(date instanceof Date)     //---------------> true
console.log(fn instanceof Function)   //------------> true//    
alert(f instanceof function)        //------------> false
//  注意:instanceof 后面一定要是对象类型,并且大小写不能错,该方法适合一些条件选择或分支。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
④ constructor 判断一个实例的构造函数是谁 对象.constructor
console.log(arr.constructor === Array) //----------> true
console.log(date.constructor === Date) //-----------> true
console.log(fn.constructor === Function) //-------> true
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
⑤jquery中的检测数据类型的方法
Query提供一系列工具方法,用来判断数据类型,以弥补JavaScript原生的typeof运算符的不足。
以下方法对参数进行判断,返回一个布尔值。

    jQuery.isArray():是否为数组。
    jQuery.isEmptyObject():是否为空对象(不含可枚举的属性)。
    jQuery.isFunction():是否为函数。
    jQuery.isNumeric():是否为数字。
    jQuery.isPlainObject():是否为使用“{}”或“new Object”生成的对象,而不是浏览器原生提供的对象。
    jQuery.isWindow():是否为window对象。
    jQuery.isXMLDoc():判断一个DOM节点是否处于XML文档之中。

总和;
/判断变量是不是数值型/

//因为NaN也是number类型的,它是不能用于数值运算的。

 function isNumber(val){
    return typeof val === 'number' && isFinite(val);
 }

// 顺便介绍一下JavaScript isFinite() 函数,isFinite() 函数用于检查其参数是否是有穷大,
// 如果 number 是有限数字(或可转换为有限数字),
// 那么返回 true。否则,如果 number 是 NaN(非数字),或者是正、负无穷大的数,则返回 false。

 /*判断变量是不是布尔类型*/
    function isBooleanType(val) {
        return typeof val ==="boolean";
    }

    /*判断变量是不是字符串类型*/
    function isStringType(val) {
        return typeof val === "string";
    }

    /*判断变量是不是Undefined*/
    function isUndefined(val) {
        return typeof val === "undefined";
    }

    var a;//a是undefined
    var s = "strType";
    alert("变量a是Undefined的判断结果是:"+isUndefined(a));
    alert("变量s是Undefined的判断结果是:"+isUndefined(s));

    /*判断变量是不是对象*/
    function isObj(str){
        if(str && typeof str === 'object' && str.constructor!=Array){
            return true;
        }
       return false
    }
    /*判断变量是不是null*/
    function isNull(val){
        return  val === null;
    }
  
    /*判断变量是不是数组*/
    //数组类型不可用typeof来判断。因为当变量是数组类型时,typeof会返回object。
   //方法1
    function isArray1(arr) {
        return Object.prototype.toString.call(arr) === '[object Array]';
    }
   //方法2
    function isArray2(arr) {
        if(arr === null || typeof arr === 'undefined'){
            return false;
        }
        return arr.constructor === Array;
    }

9. 基本数据类型 string number boolean

   复杂数据类型(引用类型)
Array  Date  Object  RegExp  String  Number  Boolean   function

值类型和引用类型

var obj = {
    name : "宅男"
};

function jinhua(param){
    //param = obj
    param.name = "高富帅";
    //下面的这句代码,重新创建了一个对象,修改了param的指向
    //但是,obj还指向原来的那个对象 所以,在修改param的时候,修改的是
    //新创建的对象,跟obj没有关系
    param = {
        name:"腐女"
    };
    param.name = "宅男";
}

jinhua(obj);

console.log(obj.name); //高富帅
//值类型做函数的参数
//函数内部的变量,也就是形参和实参只是简单的赋值操作,两个数据独立存储于内存中的
//在函数内部对形参进行修改,不会影响外面的变量

//引用类型做函数的参数
//还是把实参存储的地址赋值给了形参,在函数内部,形参同样也指向该对象,
//所以,在函数内部对该对象进行修改,会影响到外面的变量

//注意:如果在函数内部重新创建对象,为该形参赋值,那么两个对象将不再有关系
//修改其中一个,另外一个不受影响

10. delete关键字

var obj = {
     name : "尼古拉斯@赵四",
     age : 20
 }
//delete关键字可以用来删除对象的属性或方法,删除未使用var声明的变量
//delete关键字有返回值 用来表示删除属性是否成功
//如果删除的是不存在的属性,返回值为true
//如果删除的属性存在原型当中,那么返回值为true,但是并未删除

示例:删除属性 本身有返回值

	var obj = {age: 19};
	console.log(obj.age); // 19

	var b=delete obj.age;
	console.log(b);//true

	console.log(obj.age);//undefined

示例:删除变量

	var num = 1;
	// 没有用var声明的变量
	num2 = 123;
	
	var b1=delete num;   // 使用var/let/const声明的变量是无法通过 delete 运算符删除的
	var b2=delete num2;  // 可以删除
	console.log(b1)//false
	console.log(b2)//true
	console.log(num);  // 1
	console.log(num2); // 报错

示例:删除数组中的元素
// 删除数组中的元素

var arr = [1, 2];
delete arr[0];
console.log(arr); // [empty,2]  length还是2

11. 异常捕获

//异常捕获语句的完整形式

    try{
        //可能出现异常的代码
        xyz();
    }
    catch(e){
        //出现异常后的处理代码  e就是异常信息
        throw new  Error("自定义信息")//throw " 自定义信息";
    }
    finally{
        console.log("我是finally中的代码");
        //不管有没有出现异常,这里的代码都会执行
        //node.js
        //做释放资源的操作。
    }

12. 创建对象的方式

① //1.对象字面量 var obj={key:value,key:value…}
//只能创建一次对象,复用性较差,如果要创建多个对象,代码冗余度太高

 var obj = {
       name:"演员",
       singer:"薛段子手",
       type:"流行"
   };

   var obj1 ={
       name:"吻别",
       singer:"张学友",
       type:"流行"
   }

②.使用内置构造函数

   var obj = new Object();
   obj.name = "一千个伤心的母牛";
   obj.singer = "张学友";
   obj.sing = function () {
       console.log("一千个伤心的母牛");
   }

   var obj1 =new Object();
   obj.name = "一千个伤心的母牛";
   obj.singer = "张学友";
   obj.sing = function () {
       console.log("一千个伤心的母牛");
   }

③.封装简单的工厂函数 (不推荐使用了)

function createSong(songName,singerName){
    var o =new Object();
    o.name = songName;
    o.singer = singerName;

    o.sing = function () {
        console.log("让我来唱首歌");
    }
    return o;//{name:"",singer:"",sing:function...}
}
var obj = createSong("演员","薛之谦");
var obj1 = createSong("一言难尽","张宇");

④/自定义构造函数 Object Array
//什么是构造函数?
//构造函数其实也是函数,但是通常用来初始化对象
//并且和new关键字同时出现

    //new 是用来创建对象的
    //构造函数是用来初始化对象的(给对象新增成员)

    //构造函数名,首字母要大写!!!以示区分
	function Person() {
        //默认隐含的操作,把刚才用new新创建出来的对象赋值给this
        this.name = "尼古拉斯凯奇";
        this.age = 50;
        this.sayHello = function () {
            console.log("Hey man");
        }
        //如果这里写其他的代码,会执行吗?  肯定会

        return null;
    }

    var p = new Person();//new Object();
    console.log(p);
    p.sayHello();

*****构造函数的执行过程
在这里插入图片描述

    1.使用new关键字创建对象
    2.调用构造函数,把新创建出来的对象的引用赋值给构造函数内的this
    3.在构造函数内使用this为新创建出来的对象新增成员
    4.默认返回新创建的这个对象 (普通的函数,如果不写返回语句,会返回undefined)

*****构造函数的返回值
1.如果不写返回值,默认返回的是新创建出来的对象 (一般都不会去写这个return语句)
2.如果我们自己写return语句 return的是空值(return;)或者是基本类型的值或者null,都会默认返回新创建出来的对象
3.如果返回的是object类型的值,将不会返回刚才新创建的对象,取而代之的是return后面的值

13. 原型

原型:任何一个函数都有一个 prototype 的属性,函数的原型属性(prototype)的是 对象类型 的,由 构造函数 创建出来的对象,会默认链接到其构造函数的这个属性(prototype)上,构造函数的 prototype 属性的作用就是:实现数据共享
使用原型的注意事项
1.使用对象访问属性的时候,如果在本身内找不到就会去原型中查找,但是使用点语法进行属性赋值的时候,并不会去原型中进行查找,如果对象中不存在该属性,就会给该对象新增该属性,而不会去修改原型中的属性

    2.如果在原型中的属性是引用类型的属性,
    那么所有的对象共享该属性,并且一个对象修改了该引用类型属性中的成员,其他对象也都会受影响

    3.一般情况下不会将属性放到原型对象中
    一般情况下原型中只会放需要共享的方法

术语:F.prototype 原型属性
f.proto 原型对象

proto :每个对象都有一个__proto__属性,非标准,对象的 proto 与创建它的构造函数的 prototype 是一个东西

function F() {}
var o = new F();
console.log(o.__proto__ === F.prototype); //true

14. 创建函数的三种方式

	创建函数的三种方式
	1 函数声明的方式
	2 函数表达式
	3 通过 new Function() 创建 (后面单独详细介绍)
		// 1
		function foo1() {
			function f() {}
		}
		
		// 2
		var foo2 = function() {

		};

		// var foo2;
		// foo2 = function() {};

		// 3
		var foo3 = new Function();

函数声明和函数表达式的区别
注意:预解析是带var的变量和函数体,而不带Var不会预解析,如果在赋值之前打印就报错 not defined;
在这里插入图片描述

	1 函数表达式中的名字可以省略,如果没有省略,那么这个名字可以是任何的值,还有注意:这个名字只能函数体内部使用
	2 提升
		 	函数声明的方式,整个函数体都会被提升
		 	函数表达式,提升的是变量
	3 函数声明 不能出现在其他语句中
		// 不推荐
		/*if(true) {
			function f() {console.log("11111");}
		} else {
			function f() {console.log("222222");}
		}
		f();*/

		// 推荐使用这种方式
		if(true) {
			var f = function () {console.log("11111");}
		} else {
			var f = function () {console.log("222222");}
		}
		f();

15.面向对象和面向过程

面向过程:所有的细节、步骤、过程,要一步一步亲历亲为(执行者) 面向对象是对面向过程的封装
面向对象:找到能完成这个事情的对象,让它帮你完成就行(调度者)
// jQuery
// 面向对象的方式
$(“body”).append(“

jQuery创建节点就是如此潇洒

”);

// js
// 面向过程的方式

var p = document.createElement("p");
var txt = document.createTextNode("creat E..,creat T..真麻烦");
p.appendChild(txt);

document.body.appendChild(p);

面向对象优势(解决函数封装问题)
封装代码,使代码更好维护
减少全局污染
将功能相近的代码组织到一起维护方便,找错方便
面向对象的基本模型
1 将数据与功能封装成函数(方法)
2 将相关的功能绑定到一起(对象)
3 将功能进行分组(模块)

16. 关于内存释放

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

17. 作用域练习题

在这里插入图片描述
题1
在这里插入图片描述题2
在这里插入图片描述

18. 综合实战题

点击让数字加1 4种方法
在这里插入图片描述
在这里插入图片描述
上下两种一样的原理
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1434696.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Leetcode—2670. 找出不同元素数目差数组【简单】

2024每日刷题&#xff08;一零七&#xff09; Leetcode—2670. 找出不同元素数目差数组 哈希表实现代码 class Solution { public:vector<int> distinctDifferenceArray(vector<int>& nums) {unordered_set<int> s;int n nums.size();vector<int&g…

跨越视觉-语言界限:BLIP的多任务精细处理策略

BLIP 核心思想MED架构和CapFilt方法效果 总结CLIP模型 VS BLIP模型CLIP模型BLIP模型 核心思想 论文&#xff1a;https://proceedings.mlr.press/v162/li22n/li22n.pdf 代码&#xff1a;https://github.com/salesforce/BLIP BLIP&#xff08;Bootstrapping Language-Image Pre…

重生奇迹MU如何挂机

1、重生奇迹MU觉醒哪里挂机经验多挂机收益最大化&#xff0c;在重生奇迹MU中玩家可以通过副本获得大量的经验和金币&#xff0c;甚至挂机也有不错的收益&#xff0c;对于玩家来说 2、卡利玛神庙、血色城堡、迷失之城、恶魔广场甚至是挂机自动刷怪&#xff0c;组队都会有经验加…

linux安装naocs

一.安装jdk 二.安装nacos 1.下载nacos Releases alibaba/nacos GitHub 2.上传到服务器 3.解压nacos tar -zxvf nacos-server-2.3.0.tar.gz 会生成一个nacos文件夹 4.启动nacos 进入nacos/bin目录 cd nacos/bin 启动 ./startup.sh -m standalone 5.访问 http://…

【网络安全】2024年暗网威胁分析及发展预测

暗网因其非法活动而臭名昭著&#xff0c;现已发展成为一个用于各种非法目的的地下网络市场。 它是网络犯罪分子的中心&#xff0c;为被盗数据交易、黑客服务和邪恶活动合作提供了机会。为了帮助企业组织更好地了解暗网发展形势&#xff0c;近日&#xff0c;卡巴斯基的安全研究…

HarmonyOS远程真机调试方法

生成密钥库文件 打开DevEco Studio&#xff0c;点击菜单栏上的build&#xff0c; 填一些信息点击&#xff0c;没有key的话点击new一个新的key。 生成profile文件 AppGallery Connect (huawei.com) 进入该链接网站&#xff0c;点击用户与访问将刚生成的csr证书提交上去其中需…

每日学习笔记R2

【欧洲开发水面无人作战平台】 欧洲10个国家的23个企业联合开展“欧洲卫士”项目&#xff0c;目的是为欧洲多国海军开发一款配备远程控制系统的模块化水面无人作战潜艇。||项目成立的目的 该项目旨在通过提升作战平台和武器系统的先进化水平&#xff0c;满足欧盟各国海军日益…

DevOps落地笔记-15|混沌工程:通过问题注入提高系统可靠性

上一课时介绍了通过搭建一套部署流水线&#xff0c;高效、可靠的将软件部署到测试环境以及生产环境。到目前为止&#xff0c;我们学习了从用户需求到软件部署到生产环境交付给用户的全过程。随着软件工程不断发展&#xff0c;近几年&#xff0c;出现了一种新的实践&#xff0c;…

【240113】东北石油大学—调剂信息

东北石油大学 学校层级&#xff1a;双非 调剂专业&#xff1a;0857专业&#xff08;接收0854专业考生&#xff09; 发布时间&#xff1a;2024.1.13 发布来源&#xff1a;网络发布 背景&#xff1a;学习地点: 黑龙江省大庆市 (地处东北&#xff0c;冬季寒冷&#xff0c;需提…

springAop讲解

写在前面 本文旨在帮助入门和了解aop的概念以及基本用法&#xff0c;如有错误请在评论区指出&#xff0c;万分感谢。 部分资料出自尚硅谷课堂笔记,改内容更好&#xff0c;更完善。依赖准备 使用aop编程的话&#xff0c;我们需要先导入需要的依赖 spring-context: 包含Spring…

随记-Java项目处理SQL注入问题

现象&#xff1a;http://10.xx.xx.xx:xx/services/xxService 存在SQL注入情况 加固意见&#xff1a; 需要对网站所有参数中提交的数据进行过滤&#xff0c;禁止输入“"、"xor"、"or"、”--“、”#“、”select“、”and“等特殊字符&#xff1b;所有…

【LongChain-03】在本地运行LLM的另一些案例

​ 一、使用案例说明 PrivateGPT、 llama.cpp和 GPT4All等项目的流行 强调了在本地&#xff08;在您自己的设备上&#xff09;运行 LLM 的需求。 这至少有两个重要的好处&#xff1a; Privacy&#xff1a;您的数据不会发送给第三方&#xff0c;并且不受商业服务的服务条款的约…

复旦大学NLP团队发布86页大模型Agent综述

复旦大学自然语言处理团队&#xff08;FudanNLP&#xff09;发布了一篇长达86页的综述论文&#xff0c;探讨了基于大型语言模型的智能代理的现状和未来。该论文从AI Agent的历史出发&#xff0c;全面梳理了基于大型语言模型的智能代理现状&#xff0c;包括LLM-based Agent的背景…

Linux系统安全①iptables防火墙

目录 一.iptables防火墙概述 1.netfilter与iptables &#xff08;1&#xff09;netfilter &#xff08;2&#xff09;iptables 2.iptables防火墙默认规则表、链结构 二.iptables四表五链 1.四表 2.五链 3.总结 三.iptables的配置 1.安装 2.配置方法 &#xff08;1…

React开发必知必会的Hooks

文章目录 前言1、React的组件创建方式2、什么是Hook&#xff1f;3、Hook总的使用规则 一、useState二、useRef三、useEffect四、useLayoutEffect五、useReducer六、useContext七、memo与useMemo、useCallback1、memo2、useMemo3、useCallback4、三者区别 八、useImperativeHand…

C++重新入门-C++数据类型

目录 1.基本的内置类型 2.typedef 声明 3.枚举类型 4.类型转换 使用编程语言进行编程时&#xff0c;需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着&#xff0c;当您创建一个变量时&#xff0c;就会在内存中保留一些空间。 您可能需要存储…

网站为什么要用CND?

CDN对于网站来说至关重要&#xff0c;CDN对网站的重要性主要体现在可以提升用户体验、提高网站安全性、减轻服务器负担、提高SEO排名等&#xff0c;还可以为网站节省带宽成本。因此&#xff0c;选择一个性能好、速度快的CDN是很有必要的。 CDN对于现代网站来说是不可或缺的&am…

【算法分析与设计】无重复的最长子串

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 示例 示例 1: 输入: s "abcabcbb" 输…

redis下载与安装教程(centos下)

文章目录 一&#xff0c;redis下载1.1上传到linux服务器上 二&#xff0c;redis安装2.1 安装依赖2.2 解压包2.3 编译并安装2.4 指定配置启动2.5 设置redis开机自启 一&#xff0c;redis下载 官网&#xff1a; https://redis.io1.1上传到linux服务器上 我用filezila上传到/us…

【前端web入门第四天】02 CSS三大特性+背景图

文章目录: 1. CSS三大特性 1.1继承性 1.2 层叠性 1.3 优先级 1.3.1 优先级1.3.2 优先级-叠加计算规则 2. 背景图 2.1 背景属性2.2 背景图2.3 背景图的平铺方式2.4 背景图位置2.5 背景图缩放2.6 背景图固定2.7 背景复合属性 1. CSS三大特性 1.1继承性 什么是继承性? 子级默…