javascript类型转换之!!和+

一、JavaScript中双叹号(!!)作用示例介绍

!!一般用来将后面的表达式强制转换为布尔类型的数据(boolean),也就是只能是true或者false;
因为javascript是弱类型的语言(变量没有固定的数据类型)所以有时需要强制转换为相应的类型,类似的如:

a = parseInt("1234");
b = "1234" - 0; //转换为数字 
c = 1234 + "" //转换为字符串 
d = someObject.toString() //将对象转换为字符串

其中第1种、第4种为显式转换,2、3为隐式转换

布尔型的转换,javascript约定规则为:

false、undefinded、null0""false 
true1"somestring"[Object]true

对null与undefined等其他用隐式转换的值,用!操作符时都会产生true的结果,所以用两个感叹号的作用就在于将这些值转换为“等价”的布尔值。
再来看看:

var foo;
console.log(!foo); //undifined情况下,一个感叹号返回的是true; 
console.log(!goo); //null情况下,一个感叹号返回的也是true; 
var o = { flag: true };
var test = !!o.flag; //等效于var test=o.flag||false; 
console.log(test);

这段例子,演示了在undifined和null时,用一个感叹号返回的都是true,用两个感叹号返回的就是false,所以两个感叹号的作用就在于,如果明确设置了变量的值(非null/undifined/0/”“等值),结果就会根据变量的实际值来返回,如果没有设置,结果就会返回false。

二、使用+号可以将数字字符串转换为数字。
例:

var code="1";
console.log(+code); //1

Pretty JSON基本配置

{
    "use_entire_file_if_no_selection" : true, // 默认不选中时对整个文件做操作
    "indent" : 2, // 默认缩进2个空格,可自定义为缩进4个空格或一个制表符\t
    "sort_keys" : false, // 默认为对key做自然排序,有习惯的同学可以改成格式化时自然排序
    "ensure_ascii" : false // 默认关闭,开启时将对所有非ASCII编码的字符做unicode编码
}

Json Schema 再学习及相应工具

Json Schema 再学习

嵌套

{
    "$schema": "http://json-schema.org/schema#",
    "title": "详情页",
    "description": "详情页相关",
    "type": "object",
    "properties": {
        "pictures": {
            "type": "array",
            "title": "商品图片列表",
            "items": {
                "type": "string"
            },
            "minItems": 3
        },
        "title": {
            "type": "string",
            "title": "商品标题"
        },
        "price": {
            "type": "number",
            "title": "商品价格",
            "minimum": 0,
            "maximum": 100
        },
        "percentage": {
            "type": "number",
            "title": "百分比"
        },
        "info": {
            "type": "string",
            "title": "商品介绍"
        },
        "remmGoods": {
            "type": "array",
            "title": "推荐商品列表",
            "items": {
                "type": "object",
                "properties": {
                    "title": {
                        "type": "string",
                        "title": "商品标题"
                    },
                    "icon": {
                        "type": "string",
                        "title": "商品icon"
                    },
                    "price": {
                        "type": "number",
                        "title": "商品价格",
                        "minimum": 0,
                        "maximum": 100
                    },
                    "percentage": {
                        "type": "number",
                        "title": "百分比"
                    }
                }
            },
            "minItems": 1
        }
    }
}

相应工具及简要说明:

Json Schema 验证器,用于验证JSON Schema和JSON Document是否一致。当有问题时,会有错误提示。
http://jsonschemalint.com/

理解 JSON Schema,学习JSON Schema很棒的教程,还有实例。
http://spacetelescope.github.io/understanding-json-schema/index.html

dream.js 是一个轻量级的 JSON 数据生成器
https://github.com/adleroliveira/dreamjs

chance.js 为JavaScript生成指定格式的随机值
http://chancejs.com/

json介绍,由两种形式组成,对象和数组。
对象:“名称/值”对的集合
数组:值的有序列表
json介绍

JSON Schema学习

https://tools.ietf.org/html/draft-zyp-json-schema-04

A lightweight json data generator.
https://github.com/adleroliveira/dreamjs

DreamJS是一个轻量级的javascript库用于生成JSON数据。这个库可以输出随机JSON格式数据使用标准的类型,如字符串,数字,日期,布尔,数组,或与60多个内置的自定义类型,如姓名,年龄,地址,词,句,段,性别,(RGB)色等。

Json schema 是用于定义json数据结构的json媒体类型。
Json schema 为特定应用程序提供json数据的约定并规范了如何与之交互。
Json schema 指在为json数据定义校验、文档、超链接导航以及交互控制。

从 描述数据格式、 构造模拟数据 的角度,这和我们要谈的 JSON Schema 不谋而合。

什么是 Schema?

当我们在描述 XX(例:文字链接) 的时候,需要约定数据的组织方式,比如,需要知道有哪些字段,这些字段的取值如何表示等,这就是 JSON Schema 的来源。

SON Schema 定义了如何基于 JSON 格式描述 JSON 数据结构的规范,进而提供数据校验、文档生成和接口数据交互控制等一系列能力。它的特性和用途,可以大致归纳为以下几点:

1. 用于描述数据结构
在描述 JSON 数据时,如果数据本身的复杂度很高,高到三维四维,普通的标签函数已经无法表示这种层级结构了,而 JSON Schema 利用 object 和 array 字段类型的反复嵌套,可以规避掉这个缺陷。

当然,除了键值等基本信息,规范层面还提供了丰富的关键词支持,如果想通过自定义扩展字段,解决特定场景的业务需求,也是非常方便的。

2. 用于构建人机可读的文档
计算机领域有个概念叫做自描述。所谓自描述,可以理解为:文档本身包含了自身与其他文档交互相关的描述信息,不需要其他的配置文件或者额外信息来描述。

而 JSON Schema 就是自描述的,它本身就是一份很完善的说明文档,字段的含义说明、该如何取值、格式的要求等都清晰明了。

3. 用于生成模拟数据
通过标签函数生成模拟数据,只能解决基本的格式要求。比如 string 类型的字段,模拟出来的数据,无非是一个随机字符串。

但在 JSON Schema 中,由于字段的描述不仅仅是类型,更多的约束条件,可以确保模拟数据更接近于真实数据。

4. 用于校验数据,实现自动化测试
接口数据的校验工作,往往依赖于测试代码逻辑和用例。如果用 JSON Schema 描述一个数据接口,就不需要再编写测试代码了,所有的逻辑都可以移植到 JSON Schema 中维护。配合 jsv、tv4 等二方校验工具,接口测试可以真正自动化。

Javascript模块规范-AMD

AMD是”Asynchronous Module Definition”的缩写,意思就是”异步模块定义”。

采用异步方式加载模块,模块的加载不影响它后面语句的运行。所有依赖这个模块的语句,都定义在一个回调函数中,等到加载完成之后,这个回调函数才会运行。

AMD比较适合浏览器环境。

AMD也采用require()语句加载模块,它要求两个参数:

require([module], callback);

第一个参数[module],是一个数组,里面的成员就是要加载的模块;第二个参数callback,则是加载成功之后的回调函数。如果将前面的代码改写成AMD形式,就是下面这样:

AMD规范文档 https://github.com/amdjs/amdjs-api/wiki/AMD

参考;
http://www.ruanyifeng.com/blog/2012/10/asynchronous_module_definition.html
http://blog.chinaunix.net/uid-26672038-id-4112229.html

4招根治“书读完就忘”的毛病

在知乎上看到过这样的问题:

读书早晚会忘,为什么还要读书?(7K关注)
读了很多书,但是都忘掉了,读书的意义在哪里?(23K关注)

我也有朋友向我吐槽,他说自己这些年读了很多书,但是效果不好,

就像溪水流过石头,什么也没有留下

这是朋友的原话,他和我这么说时,有一股壮烈悲愤的味道。

我自认为属于『贪婪的读者』,但自身水平能力有限,谈『读书』这个话题时心里很忐忑。但是我不入地狱谁入地狱,今天就谈谈读书的问题,来抛砖引玉。

主动阅读

关于读书,我个人的做法很简单,就是4个字:

主动阅读!

就像谈论学习方法论时,简单说就是『主动学习』。

但是,越是简单的概念,其背后的内涵往往越厚重。『主动阅读』四个字简简单单,但是背后就涉及时间管理、习惯养成、科技趋势、制度流程和系统、书单、『如何阅读一本书』这类关于读书的书,甚至,『WHY』这个终极问题都息息相关。是啊,读书早晚会忘,为什么还要读书?

读书其实可以『不忘』。今天就分享一个不『不忘』的读书方法。

Kindle阅读 vs 纸书阅读

纸书之于电子阅读,就像是诺基亚之于iPhone。

虽然我读了很多年纸书,家里有很大数量的纸书,但是比起Kindle和微信读书等现代化、更适合现代节奏的移动阅读方案,纸书必然落后淘汰,最终仅限于学生学习场景和怀旧用途(参照黑胶唱机)。

Kindle的优势都不用再浪费口舌。简单提两个场景:

Kindle能有效汇聚碎片时间,用来读书。北京动不动就一小时的交通时间,有了Kindle你甚至会意识不到就已经到站;

晚上上床后入睡前,如果用Kindle代替手机或iPad,你不但失眠困扰一扫光,而且一本书根本经不起一周半个月的睡前阅读;

所以,我一直不停向身边人推荐Kindle。一定要买带背光的Paperwhite版本,淘宝美版不到800元,Kindle富一生啊。

那么,下面的阅读,专谈Kindle上的、以学习和提升为目标的阅读(不包括读《鬼吹灯》等休闲阅读)。

引导阅读行为,建立阅读习惯

推荐一个简单有奇效的法子。
借用之前写的『如何坚持写作』这篇文章里提的原理,其实读书这件事,也可以利用『执行意图』(implementation intention)这个心理学机制:

设定简单的『if X,then Y』执行规则,让目标的执行简洁,形成习惯;

举个例子吧:

规则1:如果这本书没读完,就不往kindle里放下一本书(大部分人很难成为『贪婪的读者』,但很容易成为『贪婪的电子书资源收集者』) 

规则2:如果已经上床,就不带Kindle以外的电子产品上床,而且要读Kindle到睡着(一周可以一次例外)

从简单到复杂,再回到简单

我们在『时间和知识管理』课程分享里一直说:

先把简单的事情做复杂
再把复杂的事情做简单

举例说,做事情很简单,直接做就行。然而我们要把它想得更全面、更深入,『做复杂』以至于形成自己的GTD理论体系;然后,我们在把已经复杂的的理论和规则『做简单』,一个OmniFocus成为最简洁、最高效的解决方案;

学东西很简单,直接学就行。然而我们要把它想得更全面、更深入,『做复杂』以至于形成自己的知识管理理论体系;然后,我们在把已经复杂的的理论和规则『做简单』,一个Evernote成为最简洁、最高效的解决方案;

同理,读书这件事很简单,直接读就行。但是我们今天也要把它先『做复杂』,然后,『做简单』。

搭建读书系统,确定读书规则

先从简单到复杂:找到适合你的工具、制度和规则,构建推动你不断实现目标的读书系统。

电子书管理:Calibre

Calibre是电子书管理的不二神器,支持任何格式转换、书籍信息编辑、tag、Kindle内容管理

书单工具:OmniFocus(OF)中的『阅读』项目+豆瓣读书的豆列

OF作为GTD理念的最高成就体现,将阅读应用到GTD层面再好不过了

你是否经常看到很多人推荐无数的书单,千万不要焦虑。很多人不负责任推荐,甚至他自己都没读过,或者只读过『浓缩版』、『干货版』

专注最重要;读书也要另缺勿烂。选择自己最关注的几个领域,选择最好的、最值得阅读的书,建立自己的书单

在OF中建立专门的阅读项目作为书单。OF支持无线层级,不需要设置到期时间。它就是你自己的书单,静静地躺在你的GTD系统中,供你选择

一本读完就按书单选书。避免有时间时不知道读什么书,花很长时间选来选去最后读了一本烂书

读完的书,可以考虑在『豆瓣读书』建立豆列:『XXX的2016读书记录』,这很有意义,意会吧

阅读工具:Kindle Paperwhite

Kindle阅读时,边读边标注(值得记录的一切内容):包括主要结论、事例、数据、精彩论述、精彩语句等等

这些内容,包括在此基础上的聊天、读书笔记或读后感,最终构成了你自己的素材库

笔记体系:Evernote(读书笔记)+Clippings.io(导出标注至Evernote)

Clippings.io可以一键将kindle的所有标注内容按书籍传输至Evernote中

利用Evernote中的读书标注内容,定期或读完后进行总结,写读书笔记或读后感

输出工具:Markdown写作工具+OmniOutlier(结构整理)

有位朋友说,80%的学习问题都是因为没有有效输出

读书不能闷头一个人读,读完后,和朋友聊一聊

文字形式的总结输出更重要。选一款趁手的Markdown写作工具吧,推荐iA Writer或者Ulysses

对于『特别重要』的内容,推荐利用OmniOutlier进行拆解式学习!最高效地将外部信息转化为自己头脑中的知识,这才是对作者最高的敬意(这部分写起来内容太多,以后专门写一篇)

利用OmniOutlier整理出书本/文章结构,确保达到能输出的程度。就是说,你能随口跟朋友介绍、讲明白这本书,能跟人『谈论』这本书,能向人有理有据的推荐这本书

行动、行动、行动

再从复杂回到简单:因为行动很简单(难在坚持而已)。

前面建立了『复杂的』读书系统,细化了很多读书规则,其实最终落实到行动上时,是极其简单的:

每天读30分钟书

每读完一本都做总结输出

很简单是不是。但是做起来也很难。所以,我们才不依赖个人的意志力、不依赖个人『美好的愿望』,为自己设立了这些规则、流程,搭建了这个读书系统。为什么这么做?题图里就是我经常讲的以至于老掉牙的『尤利西斯利用工具而不是自己的意志力抵抗海妖塞壬诱惑』的故事。经常讲,这里就不重复了。现在互联网上的诱惑,那比海妖塞壬不知道高到哪里去了(题图虽然是艺术作品,但是我还是打码了。就是这么稳健。哈哈)。


题图:Herbert_James_Draper_-Ulysses_and_the_Sirens(1910)

尾声

就像溪水流过石头什么也没留下,谁都不希望自己读完书的结果是这样。
那么,试一试搭建自己的阅读系统?

PHP代码添加注释的几种格式

1、用 // 开头,作为单行注释。例如:
<?php
   // Author: mole
   // Date:2012-2-8
   echo “Welcome!”;
?>

2、用 # 开头,作为单行注释。例如:
<?php
   # Author: mole
   # Date:2012-2-8
   echo “Welcome!”;
?>

3、以 /* 开头,以 * / 结束的多行注释。例如:
<?php
   /*
     下面是计算员工平均
     工资的函数

    * /
   calculate();

?>
注:上面*和/之间的空格应该是没有的