JavaScript强制类型转换
类型转换和强制类型转换?
类型转换发生在静态类型语言的编译阶段。
强制类型转换发生在动态类型语言的运行时。
并且大家所说的隐式和显式,也是取决于不同开发者的认知,在JavaScript中统称为强制类型转换。
举个显式和隐式转换的栗子:
1234567var a = 22var b = a + ''var c = +bconsole.log(typeof a,a) // number 22console.log(typeof b,b) // string 22console.log(typeof c,c) // number 22
如果说 a+ ''是隐式转换的话,那么 +b 呢? 事实上在 JavaScript 开源社区,一元操作符 + 被认为是显式强制类型转换,所以显式和隐式取决于开发者的经验。
转为字符串字符串的基本转化规则就是加上 ""。
12345console.log(null+'') // "null"console.log(undefined +' ...
JavaScript属性设置和屏蔽
本篇文章需要对 JavaScript 的原型链和属性描述符有一定的了解。
本篇文章主要分析一下,在 JavaScript 给对象设置属性或是修改对象的属性值背后的过程。
首先看这样一段代码,熟悉一下原型链:
12345678var obj = {}obj.a = 1console.log(obj.a) // 1var obj2 = {}console.log(obj2.__proto__ === Object.prototype) // trueObject.prototype.a = 233console.log(obj2.a) // 233
我们分析一下:
obj1 没什么好说的,给当前对象上设置一个属性 a,然后读取该值。
obj2 虽然没有属性 a,但是 js 会在 obj2 的原型链上查找 a 属性,然后输出 233。
属性存在于原型链上而不存在于要赋值对象的三种情况
第一种情况:
如果在**[[prototype]]**链上存在同名属性,并且没有被标记为只读 writable:false,创建屏蔽属性。
我们思考一下,如 ...
JavaScript行为委托
在 java 、c# 等语言中,类是一种必须使用的”设计模式“,但是在 JavaScript 等语言中,它是可选的,并且在JavaScript中实现类总是会有各种缺陷。
还有要注意的一点是,JavaScript中没有类,只有对象,没有继承,只有委托(prototype)。
包括 es6 的 class 语法在内的各种语法糖,也不会改变这个事实。
首先要了解两个技巧
使用 call 方法调用父构造函数可以实现继承
用 Object.create实现类式继承
“类”风格的代码
基于 原型链的 ”继承” 不是真正的继承(拷贝副本),只是”引用“而已。
12345678910111213141516171819202122232425262728293031function Foo(who){ this.me = who}Foo.prototype.identify = function(){ return "I am " + this.me}Foo.prototype.speak = function() ...
js判断数据类型
之前对js的类型判断用到的比较少,只知道typeof 和 instanceof。。
MDN上面其实介绍的挺详细的。。这里随便记一下
typeoftypeof 是一个一元操作符,返回被操作数类型的字符串。
typeof 可以在你基本可以确定数据是哪一类数据,需要稍加区分的时候使用。
1234567891011typeof 1 // "number"typeof '1' // "string"typeof true // "boolean"typeof Symbol("a") // "symbol"typeof undefined // "undefined"typeof null // "object"typeof function(){} // "function"typeof new Object() // "object"typeof [1,2,3] // &quo ...
Kruskal算法
一月份力扣出了一个月的图论题,可惜那时在封闭开发(爆粗口),有些没时间做。
Kruskal算法是一种用来查找最小生成树的算法,适合用于查找稀疏图的最小生成树。
最小生成树什么是最小生成树最小生成树是一副连通加权无向图中,一颗权值最小的生成树。
生成树:在图论中,无向图 G 的生成树(英语:Spanning Tree)是具有 G 的全部顶点,但边数最少的连通子图。
连通:无向图中,任意两个顶点都有通路。
加权:图分为有权图和无权图,权值可以理解为边的权重。
无向:图分为有向图和无向图,可以理解为边是否有方向。
权值最小:所有边的权值之和最小。
最小生成树在分布式系统中有非常重要作用。。(我收藏夹里的 MIT6.824 公开课有时间也要看看了。。)
并查集并查集是一种数据结构,不是一种算法。
并查集是Kruskal算法的关键,用于快速判断两个元素是否在同一个集合之中。(结果不能有环)
这里有个大佬的文章,对并查集讲的十分透彻:https://zhuanlan.zhihu.com/p/93647900
go的代码实现:
123456789101112131415161718192021 ...
js对象的属性描述符
属性描述符JavaScript提供了一系列方法来修改和获取对象中属性的行为。
思考下面的代码:
12345678910var myobj = { a:2}Object.getOwnPropertyDescriptor(myobj,'a')//{// configurable: true// enumerable: true// value: 2// writable: true//}
这就是myobj中属性”a”的描述符:
value:2 代表a的值是2
enumerable: true 代表属性a是可枚举的
configurable: true 代表属性a是可配置的,也就是a的属性描述符是可以修改的,可以使用defineProperty来修改属性描述符。
writable: true 代表属性a的值是可写的,也就是值是可以修改的
特殊说明:
123456789101112131415161718192021222324252627var myobj = { a: 2 ...
go的结构体和接口
刚开始学go的时候,第一遍文档看完,没有搞懂结构体和接口的意思,现在大概明白了,记录一下。
函数和方法在了解结构体和接口之前
在我写JavaScript的时候,大部分不区分这两个叫法,但是在Java中,定义在类中的函数,习惯称之为”方法”。
我在网上找到这么个说法:
函数是独立的功能,与对象无关,需要显示的传递数据
方法与对象和类相关,依赖对象而调用,可以直接处理对象上的数据,也就是隐式传递数据
c语言中只有函数
emm… 和我理解的差不多。。
在golang中可以这么理解:
函数属于一个包,分为公有函数(首字母大写,其他包可以用),私有函数(首字母小写,只能当前包内部使用)。
方法属于一个结构体。
结构体结构体的声明和使用:
123456789//...type Person struct{ age int name string}//...省略main函数p := &Person{age:22,name:"ruomu"} // 等价于 p := &Person{22,"ruom ...
重学操作系统
之前虽然也自己用vps搭搭机场、部署一下自己的小网站啥的,但是对linux和操作系统没有太多深入了解,所以双11在拉钩抢了一些课,随便记记。
这种东西还是要看多用,所以就大概过一遍知识点,有个印象。
计算机组成原理
32位和64位
如果是软件,那么我们的数据库有 32 位和 64 位版本;
如果是操作系统,那么在阿里云上选择 Centos 和 Debian 版本的时候,也会有 32/64 版本;
如果是 CPU,那么有 32 位 CPU,也有 64 位 CPU。
冯诺依曼模型输入设备输出设备内存CPU(中央处理器)
如果 CPU 每次可以计算 4 个 byte,那么我们称作 32 位 CPU
如果 CPU 每次可以计算 8 个 byte,那么我们称作 64 位 CPU
这里的 32 和 64,称作 CPU 的位宽。
总线CPU 和内存以及其他设备之间,也需要通信,因此我们用一种特殊的设备进行控制,就是总线。总线分成 3 种:
一种是地址总线,专门用来指定 CPU 将要操作的内存地址
还有一种是数据总线,用来读写内存中的数据
最后一种总线叫作控制总线,用来发送和接收关键信号 ...
golang踩坑记录
很久没发博客了,这个本来是记在有道云笔记上面的,分享一下吧。
力扣在坚持每天打卡,然后看一些书/教程/文档和网课。偶尔打两把游戏。。感觉时间不够用呐。。
learning is keeping
读取配置文件conf在项目根目录下,关于go的路径读取还有很多问题,比如go run,和go build之后运行二进制文件的路径是不一样的。
1data, err := ioutil.ReadFile("conf/app.yaml")
读取yaml文件这里map读出来的都是interface{}类型,所以我通过断言转了一下,不知道有没有问题。
1234567891011data, err := ioutil.ReadFile("conf/app.yaml")if err != nil { log.Fatalf("read config file app.yaml err: %v", err)}m := make(map[interface{}]interface{& ...
golang中的排序
今天力扣每日一题是根据数字二进制下 1 的数目排序,题目本身是简单,但是我用golang实现的时候遇到了排序的问题。
javascript的实现123456789101112131415var sortByBits = function (arr) { let countBit = function (num) { let count = 0 while (num != 0) { if (num % 2 === 1) { count++ } num = Math.floor(num / 2) } return count } return arr.sort((a, b) => { return countBit(a) - countBit(b) || a - b })}
很简单,js的sort方法的参数是一个可以自定义的函数。
golang的sortgolang有一个sort包,提供了多种类型的排序 ...